home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 January / CHIP Turkiye Ocak 1998.iso / ARACLAR / LOTUSORG / ACROREAD / INSTALL.DSK / TOOLKIT.LSS < prev    next >
Text File  |  1996-05-23  |  253KB  |  7,081 lines

  1. ''**********************************************************************
  2. ''
  3. ''   Module Name:   cominst\toolkit\toolkit.lss
  4. ''
  5. ''   Module Code:   COMINST
  6. ''
  7. ''   Author:        Dave Dupre
  8. ''
  9. ''   Change History:
  10. ''   $Log:   //CIT/VOL1/CFLOG/logfiles/cominst/toolkit/toolkit@.lss  $
  11. '' 
  12. ''    Rev 1.253   23 May 1996 12:21:34   jdonohue
  13. '' Replaced LEFTBP calls with LEFT
  14. '' 
  15. ''    Rev 1.252   16 May 1996 14:17:12   glutz
  16. '' RemovePriorVersion() buffers calls until told to execute.
  17. '' 
  18. ''    Rev 1.251   15 May 1996 13:21:32   jdonohue
  19. '' Ref SPR:    MSUN35PJBG
  20. '' Changed Winhelp call argument from "Overview" to "Install"
  21. '' 
  22. ''    Rev 1.250   02 May 1996 10:04:08   jdonohue
  23. '' Ref SPR:    RDOEHL4E94
  24. ''             PNOT2XUJRK
  25. '' Changed handling of writing uninstall string so that quotes are placed around
  26. '' arguments if the Windows new shell in use (Windows 95 and NT V. 4.0); quotes
  27. '' are NOT used for Windows NT 3.51 because of a bug in the MS Setup toolkit that
  28. '' truncates the command line with quotes.  So embedded spaces and other special
  29. '' characters (such as -) are NOT supported under Windows NT 3.51
  30. '' 
  31. ''    Rev 1.249   02 May 1996 09:22:04   glutz
  32. '' Added function RemovePriorVersion() for sspawning Uninstall.
  33. '' 
  34. ''    Rev 1.248   26 Apr 1996 08:51:38   jdonohue
  35. '' Ref SPR:    CDWT34ULDZ
  36. '' Added missing function DL_SetOraclePath (probably obsolete)
  37. '' 
  38. ''    Rev 1.247   11 Apr 1996 09:04:26   glutz
  39. '' Lot_FixupSourceDirectories check for sections in copy list.
  40. '' 
  41. ''    Rev 1.246   10 Apr 1996 16:26:20   jdonohue
  42. '' Added error checking to Lot_FixupSourceDirectories and OneUp
  43. '' 
  44. ''    Rev 1.245   10 Apr 1996 12:45:40   jdonohue
  45. '' Removed comments in Lot_FixupSourceDirectories -- enable stripping of path components
  46. '' 
  47. ''    Rev 1.244   05 Apr 1996 14:28:50   jdonohue
  48. '' Use new function FGetSectionFileList to get font filenames even if they
  49. '' have been renamed in the .INF file
  50. '' 
  51. ''    Rev 1.243   04 Apr 1996 21:41:46   glutz
  52. '' Added function Lot_AreAnyNodeOptionsAvail().
  53. '' 
  54. ''    Rev 1.242   04 Apr 1996 13:34:06   jdonohue
  55. '' Backed out fix for embedded spaces in pathnames (adding quotes) so that NT
  56. '' 3.51 uninstall icon will work for Suite 97 Beta 
  57. '' 
  58. ''    Rev 1.241   01 Apr 1996 15:10:14   jdonohue
  59. '' For Smartsuite, remove two levels of directory in MarkFixupSourceDirectory
  60. '' 
  61. ''    Rev 1.240   29 Mar 1996 16:25:26   jdonohue
  62. '' Added function OneUp which is called in Lot_FixupSourceDirectories to remove
  63. '' the last path element from the Smartmasters type destination symbol
  64. '' 
  65. ''    Rev 1.239   04 Mar 1996 08:32:08   jdonohue
  66. '' Remove 16 bit shared component support -- pass 1 : eliminate LOTUSAPP
  67. '' 
  68. ''    Rev 1.238   27 Feb 1996 15:32:24   jdonohue
  69. '' Added Lot_RegisterTypeLib that creates registry entries for Type Libraries
  70. '' 
  71. ''    Rev 1.237   15 Feb 1996 19:12:24   jdonohue
  72. '' Do not initialize LOTUSFONTSDIR
  73. '' 
  74. ''    Rev 1.236   31 Jan 1996 15:26:12   jdonohue
  75. '' Added code to delete the Product entries under Smartsuite for a single product
  76. '' install so that uninstall will work
  77. '' 
  78. ''    Rev 1.235   30 Jan 1996 15:04:50   jdonohue
  79. '' Added registry key value "InfFileName" for products in suite uninstall
  80. '' 
  81. ''    Rev 1.234   25 Jan 1996 16:28:22   jdonohue
  82. '' Added registry key under Products for prod/ver that are part of suite
  83. '' Added preliminary code for enabling single uninstall icon for suite
  84. '' Register uninstall registry objects under first product rather than UINST
  85. '' 
  86. ''    Rev 1.233   23 Jan 1996 16:27:00   cmoy
  87. '' HISHI: Merged FE changes
  88. '' 
  89. ''    Rev 1.232   19 Jan 1996 17:08:26   jdonohue
  90. '' Initialize SYM_LOTUSFONTSDIR$ in InitializeWinWinSysDir
  91. '' Add uninstall object for uninstall string
  92. '' 
  93. ''    Rev 1.231   18 Jan 1996 13:35:56   jdonohue
  94. '' Added function Lot_RegisterFonts to provide automatic font registration
  95. '' Removed functions Lot_AddFontByID and Lot_AddFontByName, not needed anymore
  96. '' 
  97. ''    Rev 1.230   17 Jan 1996 14:19:30   glutz
  98. '' Added SUB ComboSelChanged and FUNCTION GetPathFromComboEdit.
  99. '' 
  100. ''    Rev 1.229   04 Jan 1996 15:52:58   jdonohue
  101. '' Ref SPR:    TBAT2WAT6P
  102. '' Don't test InOrOut flag if file in copy list in Lot_WhereIsFeature -- this
  103. '' allows previously installed files to be found
  104. '' 
  105. ''    Rev 1.228   02 Jan 1996 16:15:28   jdonohue
  106. '' Use SYM_LOTUSFONTSDIR$ for location of fonts directory in Lot_AddFontByName
  107. '' 
  108. ''    Rev 1.227   22 Dec 1995 15:02:44   jdonohue
  109. '' Removed all references to SYM_PARENTDIR$ -- is now SYM_BASEDIR$ for all
  110. '' Added Function Lot_RegIni for future use
  111. '' 
  112. '' 
  113. ''    Rev 1.226   21 Dec 1995 14:09:16   jdonohue
  114. '' Added subs Lot_AddFontByID and Lot_AddFontByName.  These functions register a
  115. '' font with Windows and add to registry. It is assumed all fonts are installed
  116. '' to the Windows system directory
  117. '' 
  118. ''    Rev 1.225   14 Dec 1995 15:42:18   jdonohue
  119. '' Save original install directory location in  Lot_GetInstallDir instead of
  120. '' Lot_GetDestDirValueFromInstallini
  121. '' 
  122. ''    Rev 1.224   13 Dec 1995 16:29:54   jdonohue
  123. '' Ref SPR: PNOT2XUJRK
  124. '' Added quotes around pathname strings in command line to uninstall in
  125. '' Lot_RegisterUninstaller
  126. '' 
  127. ''    Rev 1.223   12 Dec 1995 11:29:48   jdonohue
  128. '' SPR Ref: TBAT2XLLZN
  129. '' Modified Lot_GetDestDirValueFromInstallini per Brian O'Donovan's suggestion t
  130. '' preserve the location of the cinstall.ini file in a static variable; this
  131. '' should point to the correct cinstall.ini for MLC installs as well
  132. '' 
  133. ''    Rev 1.222   11 Dec 1995 17:38:38   jdonohue
  134. '' Added PopulateCOBJECTLIST function to construct a list of objects in .INI 
  135. '' file; check list before creating miscellaneous object
  136. '' 
  137. ''    Rev 1.221   11 Dec 1995 14:06:32   jdonohue
  138. '' Lot_FixupSourceDirectories: added check for null source or destination
  139. '' 
  140. ''    Rev 1.220   11 Dec 1995 13:59:14   jdonohue
  141. '' Added subs Lot_FixupSourceDirectories and MarkFixupSourceDirSymbol for settin
  142. '' correct source location for node installs
  143. '' 
  144. ''    Rev 1.219   08 Nov 1995 16:58:30   tveerapp
  145. '' Fixes fot SPR#RMOO2xQQDY
  146. '' 
  147. ''    Rev 1.218   27 Oct 1995 17:07:26   glutz
  148. '' Lot_CheckPath does a NullTrim before proceeding.
  149. '' 
  150. ''    Rev 1.217   Oct 24 1995 16:55:18   cmoy
  151. '' removed eof char
  152. '' 
  153. ''    Rev 1.216   Oct 24 1995 16:25:58   mzgripce
  154. '' added Lot_CallWinhelp32 subroutine
  155. '' 
  156. ''    Rev 1.215   13 Oct 1995 15:41:14   amontalv
  157. '' For some reason the routine FGetListLength() was losing the symbol passed to it
  158. '' if it was called a second time.  We put a check in to make sure it doesn't.
  159. '' 
  160. ''    Rev 1.214   27 Sep 1995 11:18:44   jdonohue
  161. '' Don't change the destination directory symbols for non-server language instal
  162. '' 
  163. ''    Rev 1.213   22 Sep 1995 15:46:06   tveerapp
  164. '' Fixed spr#TBAT2W9U2Q. Lot_whereisfetaure was extended to look in the net
  165. '' components directory.
  166. '' 
  167. ''    Rev 1.212   22 Sep 1995 15:07:24   jdonohue
  168. '' Remove SYM_LOTUSUSERDIR$ processing
  169. '' 
  170. ''    Rev 1.211   15 Sep 1995 19:59:20   amontalv
  171. '' Added Lot_GetVol() and Lot_SplitAnyPath().
  172. '' 
  173. ''    Rev 1.210   14 Sep 1995 15:35:04   amontalv
  174. '' Don't register system path!
  175. '' 
  176. ''    Rev 1.209   14 Sep 1995 14:58:22   amontalv
  177. '' Added comments
  178. '' 
  179. ''    Rev 1.208   13 Sep 1995 17:03:06   amontalv
  180. '' Moved Lot_RegAppPath from setupapi.lss to toolkit.lss and also added a parameter.
  181. '' Lot_RegAppPath now register the registry entry .
  182. '' 
  183. ''    Rev 1.207   13 Sep 1995 14:20:22   glutz
  184. '' Added function GetLastPathComponent.
  185. '' 
  186. ''    Rev 1.206   12 Sep 1995 18:56:24   glutz
  187. '' Cleaned up some error reporting in ValidatePath, ValidateEditBox and
  188. '' ValidateBrowse.
  189. '' 
  190. ''    Rev 1.205   12 Sep 1995 11:55:54   tveerapp
  191. '' Added Lot_SaveFeaturesInInstNodeIni(), PopulateCINSTNODELIST .
  192. '' 
  193. ''    Rev 1.204   12 Sep 1995 11:18:18   glutz
  194. '' In ValidatePath set SYM_LAST_ERROR_SID to readonly before calling
  195. '' IsPathWritable.
  196. '' 
  197. ''    Rev 1.203   08 Sep 1995 14:41:44   glutz
  198. '' In ValidatePath the call to Lot_cleanPath is indepenent of volume type.
  199. '' 
  200. ''    Rev 1.202   08 Sep 1995 12:38:42   glutz
  201. '' For SPR CCOL2UKQD7 ValidatePath calls Lot_CleanPath first thing for UNC paths
  202. '' 
  203. ''    Rev 1.201   07 Sep 1995 15:22:08   amontalv
  204. '' Chop off the end of icon names longer than 40 characters if in NT.
  205. '' 
  206. ''    Rev 1.200   07 Sep 1995 10:42:26   tveerapp
  207. '' Added fix for node install network mapping in Lot_GetDestDirFromInstallIni.
  208. '' 
  209. ''    Rev 1.199   31 Aug 1995 14:00:48   tveerapp
  210. '' Fixed GetSymbolValue arg when building cinstnod.ini path
  211. '' 
  212. ''    Rev 1.198   31 Aug 1995 12:58:10   tveerapp
  213. '' NodeInstIni file path was not built correctly.Fix for spr# DCRP2UWNLS
  214. '' 
  215. ''    Rev 1.197   28 Aug 1995 16:53:00   jdonohue
  216. '' Changed USERDIR to LOTUSUSERDIR, lotususr to lotuser
  217. '' 
  218. ''    Rev 1.196   28 Aug 1995 13:32:14   amontalv
  219. '' Changed the uninstall entry to always be under \HLM\SOFTWARE\Microsoft\Windows\...
  220. '' and not \HLM\SOFTWARE\Microsoft\Windows NT\... when in NT.  Microsoft does this
  221. '' and it avoids security issues.
  222. '' 
  223. ''    Rev 1.195   24 Aug 1995 07:55:58   jdonohue
  224. '' Added SYM_USERDIR and set it
  225. '' 
  226. ''    Rev 1.194   23 Aug 1995 15:35:32   cmoy
  227. '' Added CONST MAX_NO_DRIVE_COMBOS
  228. '' 
  229. ''    Rev 1.193   21 Aug 1995 15:41:40   amontalv
  230. '' Put name of registry keys into globals.lss
  231. '' 
  232. ''    Rev 1.192   16 Aug 1995 20:33:28   amontalv
  233. '' Added code to do error messages for registry.
  234. '' 
  235. ''    Rev 1.191   16 Aug 1995 12:27:46   mmeth
  236. '' fix for  SPR# DCRP2UWNS9
  237. '' The node install was trying to write the path to the install directory
  238. '' into the registry.  Instead, we needed to write the path to the 
  239. '' target directory.
  240. '' 
  241. ''    Rev 1.190   15 Aug 1995 12:32:34   glutz
  242. '' Had to set the text for "Path not writable" just before displaying message.
  243. '' 
  244. ''    Rev 1.189   14 Aug 1995 17:00:22   amontalv
  245. '' During creation of Uninstall program group icon, I needed to point to the file again
  246. '' in the fourth parameter.  I though that that was starting directory, but seems to
  247. '' deal with icon.
  248. '' 
  249. ''    Rev 1.188   14 Aug 1995 11:12:28   jdonohue
  250. '' Allow filenames with more than 12 characters in MakePath
  251. '' 
  252. ''    Rev 1.187   09 Aug 1995 12:01:46   cmoy
  253. '' Commented out ProdAcronym variable. This is  not used
  254. '' 
  255. ''    Rev 1.186   Aug 09 1995 11:49:16   cmoy
  256. '' remove declaration on LOT_WRITECRITICALDIRECTORIES
  257. '' 
  258. ''    Rev 1.185   08 Aug 1995 12:55:14   tveerapp
  259. '' Added Lot_WriteCriticalDirectories. It is called in Lot_SaveFeaturesInInstal
  260. '' Ini. 
  261. '' 
  262. ''    Rev 1.184   07 Aug 1995 11:49:32   tveerapp
  263. '' Added a new function Lot_GetDestDirSymFrom InstallIni().
  264. '' 
  265. ''    Rev 1.183   07 Aug 1995 09:14:02   mmeth
  266. '' Fixed a typo I put in wrt a comment character.
  267. '' 
  268. ''    Rev 1.182   07 Aug 1995 08:24:52   mmeth
  269. '' Part 2 of fix for SPR# JHOH2M4HZL:
  270. '' No longer check length of strings being written in Lot_WriteToRiFile.
  271. '' Because this C function now truncates the length to 80 bytes + terminator
  272. '' itsself.  ALso changed the length of buffers to 82 in Lot_ReadDefaultsfromRi
  273. '' to handle the 80 bytes of characters plus terminating character.
  274. '' 
  275. ''    Rev 1.181   05 Aug 1995 13:27:10   jdonohue
  276. '' Backed out code to eliminate non-network drives for server install
  277. '' 
  278. ''    Rev 1.180   04 Aug 1995 17:27:08   amontalv
  279. '' Fixed command for uninstall icon.
  280. '' 
  281. ''    Rev 1.179   04 Aug 1995 16:38:36   glutz
  282. '' More subtle changes to ValidatePath.
  283. '' 
  284. ''    Rev 1.178   04 Aug 1995 12:24:04   glutz
  285. '' Cleaned up a problem displaying errors from ValidatePath.
  286. '' 
  287. ''    Rev 1.177   04 Aug 1995 08:42:58   glutz
  288. '' Changed the way ValidatePath handle some error messages.
  289. '' 
  290. ''    Rev 1.176   03 Aug 1995 15:41:22   amontalv
  291. '' Added one to length of registry entry for Uninstall.
  292. '' 
  293. ''    Rev 1.175   03 Aug 1995 15:32:42   glutz
  294. '' Changing method for error mesaages in ValidatePath.
  295. '' 
  296. ''    Rev 1.174   02 Aug 1995 16:20:10   amontalv
  297. '' Changed uninstall flags.  /L -> /O and /P -> /L
  298. '' 
  299. ''    Rev 1.173   02 Aug 1995 10:03:44   glutz
  300. '' Added unc volumes to server list in Lot_GetDriveFreeSpaceList.
  301. '' 
  302. ''    Rev 1.172   01 Aug 1995 16:14:52   amontalv
  303. '' Added uninstall information for ininstall icon
  304. '' 
  305. ''    Rev 1.171   01 Aug 1995 11:04:04   glutz
  306. '' Changed the order of some of the checks in ValidatePath so that UNC roots
  307. '' would be checked before invalid path names.
  308. '' 
  309. ''    Rev 1.170   31 Jul 1995 15:00:26   jdonohue
  310. '' Moved Reg_??? functions to Register.lss
  311. '' Added code to select only network drives for server install
  312. '' 
  313. ''    Rev 1.169   31 Jul 1995 10:54:28   amontalv
  314. '' No change
  315. '' 
  316. ''    Rev 1.168   28 Jul 1995 11:59:26   glutz
  317. '' IsPathWritable now passes the UNC path to Lot_CheckPath.
  318. '' 
  319. ''    Rev 1.167   27 Jul 1995 16:18:42   pdonahue
  320. '' added code to surface new error message 
  321. '' 
  322. ''    Rev 1.166   27 Jul 1995 14:01:34   amontalv
  323. '' Added call to create icons for uninstall in WinNt.
  324. '' 
  325. ''    Rev 1.165   27 Jul 1995 11:04:28   amontalv
  326. '' Added call Lot_AddLinkIconToFolder so that icon information can be sent
  327. '' when creating a shortcut.
  328. '' 
  329. ''    Rev 1.164   24 Jul 1995 11:39:38   glutz
  330. '' Read sn.dat from temp directory.
  331. '' 
  332. ''    Rev 1.163   20 Jul 1995 12:58:52   jdonohue
  333. '' Changed CopyFile to FCopyFile, which calls Win32 CopyFile instead of MS-Setup
  334. '' FCopyOneFile
  335. '' 
  336. ''    Rev 1.162   20 Jul 1995 10:53:54   glutz
  337. '' GetFreeSpace now returns K bytes so I made changes accordingly.
  338. '' 
  339. ''    Rev 1.161   20 Jul 1995 08:02:48   jdonohue
  340. '' Added check for null string in ValidatePath
  341. '' 
  342. ''    Rev 1.160   19 Jul 1995 16:37:24   glutz
  343. '' lcbNeed is now K bytes based so I took the \ 1024 out of CheskForSpace.
  344. '' 
  345. ''    Rev 1.159   18 Jul 1995 09:17:26   glutz
  346. '' ValidateBrowse was not updating edit box for UNC paths.
  347. '' 
  348. ''    Rev 1.158   17 Jul 1995 16:38:06   glutz
  349. '' Added function ValidateBrowse to set the combo and edit boxes after a browse.
  350. '' 
  351. ''    Rev 1.157   17 Jul 1995 15:52:12   glutz
  352. '' ValidatePath was checking path length before it was cleaning the path
  353. '' This would allow installation to \flw\..\
  354. '' 
  355. ''    Rev 1.156   17 Jul 1995 15:32:36   amontalv
  356. '' Changed the prodno in Lot_AddLinkToFolder to always be 1.
  357. '' 
  358. ''    Rev 1.155   17 Jul 1995 13:51:50   amontalv
  359. '' Added "Overview" to Windows Help, so that we would have the new help look.
  360. '' 
  361. ''    Rev 1.154   17 Jul 1995 13:33:08   glutz
  362. '' All error messages concerning paths are suppressed if a UNC volume
  363. '' cannot be mapped to a drive letter.
  364. '' 
  365. ''    Rev 1.153   13 Jul 1995 11:25:34   tveerapp
  366. '' Modified the comments for Reg_GetObsFiles.
  367. '' 
  368. ''    Rev 1.152   13 Jul 1995 11:22:26   tveerapp
  369. '' Added Reg_SetObsFiles, RegGetObsFilesto support Obsolete files flag.
  370. '' 
  371. ''    Rev 1.151   12 Jul 1995 16:53:26   glutz
  372. '' Had to limit the length of the unc volume int the insufficient disk
  373. '' space dialog.
  374. '' 
  375. ''    Rev 1.150   11 Jul 1995 12:09:24   tveerapp
  376. '' Changed Lot_RegiterUinstallhandler, Lot_RegisterObjects to not
  377. '' register during a server, distrbution install.
  378. '' 
  379. ''    Rev 1.149   07 Jul 1995 15:58:32   glutz
  380. '' Added UNC volumes to CheckForSpace routine.
  381. '' 
  382. ''    Rev 1.148   06 Jul 1995 12:23:04   mzgripce
  383. '' change the destination of the uninstaller fron the components directory
  384. '' to the windows directory
  385. '' 
  386. ''    Rev 1.147   28 Jun 1995 15:54:36   tveerapp
  387. '' Fixed EXECUTE requiring Sub Initialize.
  388. '' 
  389. ''    Rev 1.146   27 Jun 1995 15:54:32   mzgripce
  390. '' put the execute string between sub initialize and end sub to enable 
  391. '' on error / error # handeling for share processing
  392. '' 
  393. ''    Rev 1.145   23 Jun 1995 17:09:24   mzgripce
  394. '' fixed jmoy2t4pny pert 2 by compensating if the user starts a path with no \
  395. '' 
  396. ''    Rev 1.144   23 Jun 1995 12:47:42   mzgripce
  397. '' add program_group class 
  398. '' 
  399. ''    Rev 1.143   23 Jun 1995 12:22:12   jdonohue
  400. '' Added FindResourceinDLL function, add global string for name of our generic
  401. '' dialog proc and use in AddToBillboardList (original argument not used)
  402. '' 
  403. ''    Rev 1.142   22 Jun 1995 17:27:08   mzgripce
  404. '' add hive class to register object
  405. '' 
  406. ''    Rev 1.141   22 Jun 1995 12:43:56   jdonohue
  407. '' Revised AddToBillboardList to look for resource in list of DLLs
  408. '' 
  409. ''    Rev 1.140   22 Jun 1995 10:59:00   mzgripce
  410. '' change the cinstnode.ini filename to cinstnod.ini 
  411. '' 
  412. ''    Rev 1.139   21 Jun 1995 14:27:28   glutz
  413. '' Added function ValidateEditBox to check edit box
  414. '' strings for valid letter drives or UNC volumes
  415. '' 
  416. ''    Rev 1.138   19 Jun 1995 18:45:18   mzgripce
  417. '' change lot_callShare to call the sharetools if share or share32 are supported
  418. '' 
  419. ''    Rev 1.137   19 Jun 1995 17:40:12   mzgripce
  420. '' change the key Display Name to DisplayName (for uninstaller)
  421. '' 
  422. ''    Rev 1.136   19 Jun 1995 16:39:44   mzgripce
  423. '' add Lot_RegisterObject
  424. '' 
  425. ''    Rev 1.135   19 Jun 1995 10:27:20   amontalv
  426. '' Put in code to add function to New Folder button and Remove Folder button.  Also
  427. '' fixed some of the selection problems in the tree list.
  428. '' 
  429. ''    Rev 1.134   15 Jun 1995 19:41:30   amontalv
  430. '' Checked for and changed integers passed to C functions.  Changed to longs.
  431. '' 
  432. ''    Rev 1.133   15 Jun 1995 17:52:20   amontalv
  433. '' The problem with the program groups and errors with installed features was that
  434. '' the C code FFindFirst() expected a integer that contained the flag for which to look.
  435. '' In LotusScript when we called this function we passed an integer, but an integer
  436. '' in Script is different than an integer in C.  The fix is to convert the Script
  437. '' integer to a long using Clng() at the call for the C function.
  438. '' 
  439. ''    Rev 1.132   13 Jun 1995 17:27:08   mzgripce
  440. '' import FWriteDestinationSymAndVal, write Lot_WriteDestinationSymAndVal 
  441. '' subroutine and call it in Lot_SaveFeature to register the dir symbols
  442. '' and their values for uninstall
  443. '' 
  444. ''    Rev 1.131   12 Jun 1995 15:10:30   tveerapp
  445. '' Added a check in the function Lot_TrimEndSlash. Checks if the
  446. '' string is of length > 0. Script's MID$ chokes on an empty path string.
  447. '' 
  448. ''    Rev 1.130   09 Jun 1995 17:05:42   mzgripce
  449. '' added Lot_Register_Uninstaller
  450. '' 
  451. ''    Rev 1.129   09 Jun 1995 15:08:54   amontalv
  452. '' Added code to set global variable in START.LSS to error condition value.
  453. '' 
  454. ''    Rev 1.128   09 Jun 1995 14:25:58   glutz
  455. '' Fixed unc mapping bug
  456. '' 
  457. ''    Rev 1.127   09 Jun 1995 11:28:38   jdonohue
  458. '' Send quit message to WinHelp
  459. '' 
  460. ''    Rev 1.126   08 Jun 1995 16:48:54   jdonohue
  461. '' Added cancel option for tight disk space message box
  462. '' 
  463. ''    Rev 1.123   07 Jun 1995 17:50:12   amontalv
  464. '' Set the Selected folder to the root only the first time that
  465. '' Reg_SetProgManagerGroup is called.
  466. '' 
  467. ''    Rev 1.122   07 Jun 1995 16:30:44   amontalv
  468. '' Changed the Win95 start folder so that it initializes
  469. '' earlier in the program.  This should make automation
  470. '' easier to implement for it.  There are still a couple of
  471. '' bugs that I need to work out, but I feel that I should
  472. '' check what I have now.
  473. '' 
  474. ''    Rev 1.121   07 Jun 1995 11:23:24   glutz
  475. '' ValidatePath and IsPathwritable now work with UNC volumes
  476. '' 
  477. ''    Rev 1.120   06 Jun 1995 15:59:28   amontalv
  478. '' We are experiencing problems with LotusScript when we fill buffers with
  479. '' nulls and then pass them to C routines.  For the time being, it is suggested
  480. '' that we fill our buffers with spaces.  To this end (and to make it
  481. '' easier to change back later) I have created a small LotusScript routine
  482. '' named CreateBuffer.  You use it any time you ordinarily would use
  483. '' STRING$(num, 0).  CreateBuffer() just needs the num, it decides what to
  484. '' fill the buffer with (sorry about the grammer).  Right now it fill the
  485. '' buffer with spaces.  Later we will change it back to nulls.  Also look
  486. '' at the routine NullTrim().  It will get rid of final nulls and spaces.
  487. '' You can use this when getting a buffer that has been changed or filled
  488. '' in a external C routine.
  489. '' 
  490. ''    Rev 1.119   06 Jun 1995 15:34:44   mzgripce
  491. '' added 3 fields ti the prods struct to support moreDirectories prompt and
  492. '' 4 CIT functions (one set and three gets) to register this data with CIT
  493. '' 
  494. ''    Rev 1.118   05 Jun 1995 18:15:22   tveerapp
  495. '' Removed SetTheComponentsDir. This is taken care of in InitShare32
  496. '' in share32.lss.
  497. '' 
  498. ''    Rev 1.117   05 Jun 1995 16:37:20   amontalv
  499. '' Made changes for migrating to LotusScript version 3.0.37.
  500. '' 
  501. ''    Rev 1.116   02 Jun 1995 14:49:06   tveerapp
  502. '' Changed IDC_HELP to IDC_CITHELP.
  503. '' 
  504. ''    Rev 1.115   02 Jun 1995 08:54:26   glutz
  505. '' Lot_checkPath calls Lot_SplitUNCPath
  506. '' 
  507. ''    Rev 1.114   01 Jun 1995 17:02:04   glutz
  508. '' Lot_GheckPath works with UNC paths
  509. '' 
  510. ''    Rev 1.113   01 Jun 1995 11:11:44   amontalv
  511. '' Added API function CreateLink to create shortcuts.  Also added functions
  512. '' to save and get the link path to support the CreateLink.  I also changed
  513. '' the startup program folder code to use the default dialog proc and changed
  514. '' the default dialog proc to process directory trees.
  515. '' 
  516. ''    Rev 1.112   31 May 1995 09:52:20   callanan
  517. '' Accessing help from the lotustmp dir not the current directory as the 
  518. '' current directory changes when you change drive.
  519. '' 
  520. ''    Rev 1.111   30 May 1995 15:43:34   amontalv
  521. '' Made a new function PopupWithFunction.  PopupModalDlg now calls this.  Needed to
  522. '' do this to call dialog with my own dialog function.
  523. '' 
  524. ''    Rev 1.110   30 May 1995 13:09:32   jdonohue
  525. '' Pass DLL list in argument to FDoDialog
  526. '' 
  527. ''    Rev 1.109   30 May 1995 10:00:00   amontalv
  528. '' Added routine PopupFolderDlg to put up the Win95 Program folder dialog.
  529. '' 
  530. ''    Rev 1.108   25 May 1995 20:43:40   amontalv
  531. '' Checked in for Greg Lutz.  He commented out code that validated path in order
  532. '' to get long file names.
  533. '' 
  534. ''    Rev 1.107   19 May 1995 19:06:00   glutz
  535. '' Added some comments to UNC functions
  536. '' 
  537. ''    Rev 1.106   18 May 1995 12:21:20   tveerapp
  538. '' Added SetTheComponentsDir stub.MZ to fill in contents.
  539. '' 
  540. ''    Rev 1.105   18 May 1995 10:37:46   jdonohue
  541. '' Fixed logic for AddToBillboardList with multiple resource DLLs
  542. '' 
  543. ''    Rev 1.104   17 May 1995 17:53:50   mzgripce
  544. '' Change Reg_SetLicenserSupport() and Reg_SetLicenseSelected() to eliminate
  545. '' Licenser support 
  546. '' 
  547. ''    Rev 1.103   16 May 1995 17:13:06   amontalv
  548. '' Had to change the name of the dialog proc to _FNameOrgDlgProc@16.
  549. '' 
  550. ''    Rev 1.102   16 May 1995 17:07:56   glutz
  551. '' Split all automation functions out to automate.lss
  552. '' 
  553. ''    Rev 1.101   16 May 1995 09:19:52   glutz
  554. '' Added wrappers for
  555. '' FAddToDriveFreeSpaceList
  556. '' FIsUnvalidatedUNCPath
  557. '' FisValidUNCPath
  558. '' Added SUB Lot_SplitUNCPath
  559. '' Added functions'
  560. '' Lot_IsUnvalidatedUNCPath
  561. '' Lot_IsValidUNCPath
  562. '' Modified
  563. '' IsPathWritable
  564. '' ValidatePath
  565. '' SelectDriveCombo
  566. '' 
  567. ''    Rev 1.100   15 May 1995 11:19:18   jdonohue
  568. '' Call SetUpApi in initialize function
  569. '' 
  570. ''    Rev 1.99   11 May 1995 16:55:58   tveerapp
  571. '' Added a global variable gLogFile$ . Commented out the calls
  572. '' to WriteToLogFile - this is no longer a function.
  573. '' 
  574. ''    Rev 1.98   03 May 1995 18:17:40   mzgripce
  575. '' fix the syntax errors 
  576. '' 
  577. ''    Rev 1.97   03 May 1995 11:45:56   tveerapp
  578. '' Fixed the cfbuild-c2build merge.
  579. '' 
  580. ''    Rev 1.96   02 May 1995 17:51:08   mzgripce
  581. '' fixed some syntax errors in new features 
  582. '' 
  583. ''    Rev 1.95   02 May 1995 12:53:34   cmoy
  584. '' Merged c2 into cf build
  585. '' 
  586. ''    Rev 1.88   27 Apr 1995 16:48:10   mheerman
  587. '' Removed debug print from help case.
  588. ''    Rev 1.92F  26 Apr 1995 17:33:42   mzgripce
  589. '' replace TwoMainDirFlag with ExtraProdDirsNum and change the 
  590. '' subroutine and function name that process it.
  591. '' 
  592. ''    Rev 1.91F  25 Apr 1995 17:10:46   mzgripce
  593. '' add a new field: TwoMainDirFlag to ProdInfo Structure
  594. '' add SUBROUTINE Reg_SetTwoMainDirFlag and FUNCTION Reg_GetProdSupportForTwo-
  595. '' MainDir()
  596. '' change Reg_RegisterProductNames to set TwoMainDirFlag to 0
  597. '' 
  598. ''    Rev 1.87   14 Apr 1995 16:03:16   amontalv
  599. '' Deleted code that took care of final null in nul terminated strings.
  600. ''    Rev 1.90F  25 Apr 1995 11:45:20   tveerapp
  601. '' Added Lot_AutoCustomizeShare().
  602. '' 
  603. ''    Rev 1.86   10 Apr 1995 17:58:42   amontalv
  604. '' Made changes to functions and to some callback routines.
  605. ''    Rev 1.89F  24 Apr 1995 14:02:08   tveerapp
  606. '' Fixed Lot_AutoInstallCustomize.
  607. '' 
  608. ''    Rev 1.88   19 Apr 1995 14:38:24   jdonohue
  609. '' Changed SYM_CUIDLL$ from DLL name to list of DLLs in PopupMod..Dialog and 
  610. '' AddToBillboardList
  611. '' 
  612. ''    Rev 1.87F  13 Apr 1995 10:46:36   mzgripce
  613. '' Add Share32 field to ProdInfo struct
  614. '' Change Reg_RegiserProductNames to set the default of Share32 to 0
  615. '' added: Lot_AreShare32ToolsSupported(); Lot_GetShare32ToolsSize()
  616. '' Reg_GetProdSupportForShare32(); Reg_SetShare32Flag()
  617. '' 
  618. ''    Rev 1.86F  13 Apr 1995 19:00:20   tveerapp
  619. '' Added Lot_AutoInstallCustomize.
  620. '' 
  621. ''    Rev 1.85   05 Apr 1995 19:53:52   amontalv
  622. '' Porting to 32 bit.
  623. '' 
  624. ''    Rev 1.84   31 Mar 1995 18:47:52   amontalv
  625. '' Had to add aliases to function names for LotusScript to find them in DLLs
  626. '' 
  627. ''    Rev 1.83   20 Jan 1995 16:42:48   tveerapp
  628. '' 
  629. '' Fixed spr# ccol2nsl4. In autogetsetlicenser,moved the if licselected% to the right place.
  630. '' 
  631. ''    Rev 1.82   17 Jan 1995 16:45:12   tveerapp
  632. '' 
  633. '' Replaced existing error message for AutoCheckForspace.
  634. '' Fixes spr# TVEN2NBNEP.
  635. '' 
  636. ''    Rev 1.81   14 Jan 1995 15:58:54   jplump
  637. '' 
  638. '' Removed else case in Lot_AutoSuiteAppSelect. Before this routine
  639. '' is called in main, there is a check to see if the product is a
  640. '' SUITE; if it is not, this routine is not called. Therefore, the
  641. '' else case (if not Suite) in this routine won't happen. If the logic
  642. '' in main changes not to check for Suite, then the else case should
  643. '' not post an error for the user, but return to main without looking
  644. '' for Suite Applications.
  645. '' 
  646. ''    Rev 1.80   13 Jan 1995 11:28:18   jplump
  647. '' 
  648. '' In Lot_AutoGetInstallType, added option 4 (node). This option really doesn't
  649. '' do anything if the user has already done a server install and is doing a 
  650. '' legitimate node install. However, if the user has not done a server install
  651. '' and puts 4 as the install type, an error will be displayed. This error tells
  652. '' the user that he must to a server install first.
  653. '' 
  654. '' 
  655. '' 
  656. ''    Rev 1.79   11 Jan 1995 10:28:24   tveerapp
  657. '' 
  658. '' Fixed the logic in the AutoNodeoptions processing. Changed the OR to AND.
  659. '' The error should be signaled only if it is neither a 1 nor a 0.
  660. '' 
  661. ''    Rev 1.78   10 Jan 1995 19:04:38   jplump
  662. '' 
  663. '' When processing values from RSP file in automation,
  664. '' added check for missing value before casting string
  665. '' to integer. This is a workaround for a bug in
  666. '' LotusScript. An empty string should be a 0 when 
  667. '' cast to an integer (CINT), but it is not.
  668. '' SPR JMOY2N7QVK
  669. '' 
  670. ''    Rev 1.77   09 Jan 1995 16:50:32   tveerapp
  671. '' 
  672. '' Removed redundant code from Lot_CheckRSPPath as a result of the preious change(1).
  673. '' 
  674. ''    Rev 1.76   09 Jan 1995 16:48:04   tveerapp
  675. '' 
  676. '' Two changes:
  677. '' 1. Fixed the default for Lot_CheckRSPPath's return value to be "".
  678. '' 2. Fixed spr# JHOH2N7PHF
  679. '' 
  680. ''    Rev 1.75   07 Jan 1995 18:26:02   jplump
  681. '' 
  682. '' Made changes to keyword and section processing in Lot_Auto???
  683. '' functions to reflect changes in auto.rsp due to DOC review.
  684. '' 
  685. '' 
  686. ''    Rev 1.74   07 Jan 1995 15:56:20   jplump
  687. '' 
  688. '' In Lot_AutoCheckRSPPath fixed problem with function
  689. '' returning and invalid path. Calling functions should
  690. '' expect an empty string as a return value if the path
  691. '' is invalid.
  692. '' 
  693. ''    Rev 1.73   30 Dec 1994 14:12:28   jplump
  694. '' 
  695. '' Removed section name from error case in Select Applications processing
  696. '' 
  697. ''    Rev 1.72   30 Dec 1994 14:00:40   jplump
  698. '' 
  699. '' Added Lot_Auto_CheckRSPPath to validate paths in the response file.
  700. '' If the user does not supply a path in the rsp file, he\she will get
  701. '' this message: "Automated Install Error. Response File: One or more
  702. '' product directory paths are invalid in section:      " If the user
  703. '' supplies a path that is invalid, the invalid path message will be
  704. '' displayed first, and then Automated Install Error.
  705. '' 
  706. '' 
  707. ''    Rev 1.71   23 Dec 1994 18:34:30   jplump
  708. '' 
  709. '' Changed automation errors to be resourced errors.
  710. '' 
  711. ''    Rev 1.70   23 Dec 1994 14:07:44   jplump
  712. '' 
  713. '' Added Lot_AutoGetSetLicenserInfo
  714. '' Removed print statements
  715. '' Enhanced AutoDebug function
  716. '' 
  717. '' 
  718. ''    Rev 1.69   22 Dec 1994 15:09:08   tveerapp
  719. '' 
  720. '' Added Error Msg to AutoCheckForSpace
  721. '' 
  722. ''    Rev 1.68   22 Dec 1994 14:27:16   tveerapp
  723. '' 
  724. '' Fixed a type mismatch
  725. '' 
  726. ''    Rev 1.67   22 Dec 1994 14:22:42   tveerapp
  727. '' 
  728. '' Modified Lot_AutoGetProductDestDir.. for suite.
  729. '' 
  730. ''    Rev 1.66   22 Dec 1994 13:28:26   tveerapp
  731. '' 
  732. '' Fixed Lot_AutoSuiteAppSelect function.
  733. '' 
  734. ''    Rev 1.65   22 Dec 1994 11:38:52   tveerapp
  735. '' 
  736. '' Changed Lot_Check path to ValidatePath in Lot_AutoGetProductDestDir.
  737. '' 
  738. ''    Rev 1.64   21 Dec 1994 17:18:34   tveerapp
  739. '' 
  740. '' Fixed a type mismatch
  741. '' 
  742. ''    Rev 1.63   21 Dec 1994 17:08:22   tveerapp
  743. '' 
  744. '' Added Lot_AutoProcessNodeOptions.
  745. '' 
  746. ''    Rev 1.62   21 Dec 1994 14:58:44   tveerapp
  747. '' 
  748. '' Removed an erroneous end case
  749. '' 
  750. ''    Rev 1.61   21 Dec 1994 14:56:12   tveerapp
  751. '' 
  752. '' Fixed a typo
  753. '' 
  754. ''    Rev 1.60   21 Dec 1994 13:10:00   tveerapp
  755. '' 
  756. '' Added a missing end if and Next
  757. '' 
  758. ''    Rev 1.59   21 Dec 1994 13:03:12   tveerapp
  759. '' 
  760. '' Added Lot_AutoSuiteAppSel function. Added Error messages that need to be resourced!!
  761. '' Modified Lot-AutoGetSIzeofInstall.
  762. '' 
  763. ''    Rev 1.58   21 Dec 1994 11:54:48   tveerapp
  764. '' 
  765. '' Modified Lot_AutoGetBase function. It returns the base directory instead of setting it.
  766. '' 
  767. ''    Rev 1.57   12 Dec 1994 11:36:34   tveerapp
  768. '' 
  769. '' Incorporated jill's changes to Lot_AutoGetProductDestinationDir and
  770. '' Lot_AutoWriteOutDebugFile. Remmed out the existing functions. These
  771. '' can be removed after verfication with jill.
  772. '' 
  773. ''    Rev 1.56   12 Dec 1994 11:05:08   mzgripce
  774. '' 
  775. '' Added 4 funcs:Lot_AutoChangeLotusAppDir(), Lot_AutoConsolidateLotusAppDir()
  776. '' Lot_AutoConsolidateMoveCopy(), Lot_AutoIsThisNetLotusApp() 
  777. '' 
  778. ''    Rev 1.55   08 Dec 1994 20:10:34   jplump
  779. '' Added Lot_AutoWriteOutDebugFile
  780. '' Fixed Lot_AutoGetProductDestDirSymbol to use prodno%
  781. '' 
  782. ''    Rev 1.54   06 Dec 1994 17:21:00   tveerapp
  783. '' 
  784. '' Modified Lot_GetKeyValFromResponseFile to set gAutoFile$ to thw
  785. '' value of the symbol processed by shell in the command line.
  786. '' 
  787. ''    Rev 1.53   06 Dec 1994 10:23:54   tveerapp
  788. '' 
  789. '' Added Lot_AutoCinfigureAutoExec function and AutoInstallReboot.
  790. '' 
  791. ''    Rev 1.52   05 Dec 1994 15:09:52   jplump
  792. '' Added Lot_AutoGetUserInfo
  793. '' 
  794. ''    Rev 1.51   02 Dec 1994 15:56:56   cmoy
  795. '' 
  796. '' Merged automation files
  797. '' 
  798. ''    Rev 1.50   02 Dec 1994 15:10:42   cmoy
  799. '' 
  800. ''    Rev 1.11   01 Dec 1994 17:30:54   tveerapp
  801. '' 
  802. '' Added The AutoCheckSpace function.
  803. '' 
  804. ''    Rev 1.10   01 Dec 1994 10:22:16   jplump
  805. '' Added character checking to Lot_AutoGetProgramGroup
  806. '' 
  807. '' 
  808. '' 
  809. ''    Rev 1.9   30 Nov 1994 10:19:56   tveerapp
  810. '' Modified RegisterCallback function to register a callback only when not
  811. '' in the automation mode.
  812. '' 
  813. ''    Rev 1.8   29 Nov 1994 14:27:22   tveerapp
  814. '' Added a check to Lot_GetKeyValFromResponseFile.
  815. '' 
  816. ''    Rev 1.7   29 Nov 1994 12:53:34   tveerapp
  817. '' 
  818. '' Added i%, nProds to the declartions.D
  819. '' 
  820. ''    Rev 1.6   29 Nov 1994 12:45:54   tveerapp
  821. '' Modified Lot_AutoGetSizeOFinstall function. It returns an integer.
  822. '' 
  823. ''    Rev 1.5   29 Nov 1994 11:42:18   jplump
  824. '' 
  825. '' Added functions:  Lot_AutoGetSizeOfInstall & 
  826. '' Lot_AutoGetProgramGroup.
  827. '' 
  828. ''    Rev 1.4   23 Nov 1994 16:27:40   tveerapp
  829. '' 
  830. '' Added Lot_AutoGetInstallType function used in main.
  831. '' 
  832. ''    Rev 1.3   23 Nov 1994 15:22:02   tveerapp
  833. '' 
  834. '' Modified PopupModal for Automation.
  835. '' 
  836. ''    Rev 1.2   23 Nov 1994 14:02:02   jplump
  837. '' Added Lot_AutoGetBaseDirSymbol
  838. '' 
  839. ''    Rev 1.1   22 Nov 1994 16:34:40   jplump
  840. '' 
  841. '' Added INIT symbol processor
  842. '' 
  843. ''    Rev 1.0   22 Nov 1994 16:26:10   jplump
  844. '' Initial Revision
  845. ''==========
  846. '' 
  847. ''    Rev 1.47   02 Nov 1994 18:33:34   jplump
  848. '' Resourced error message in ModifyAutoexec()
  849. '' SID_ERR_AUTOEXEC_NOT_COPIED
  850. '' 
  851. '' Jill Salter Plump
  852. '' 
  853. '' 
  854. ''    Rev 1.46   03 Oct 1994 11:12:12   tveerapp
  855. '' Fixed spr# 1023351. Makepath checks for 13 chars. and a \.
  856. '' If valid accepts it else returns an empty string.
  857. '' 
  858. ''    Rev 1.45   27 Sep 1994 13:05:56   cmoy
  859. '' Added constants needed for rebooting and restarting
  860. '' 
  861. ''    Rev 1.44   22 Sep 1994 09:35:42   mzgripce
  862. '' Add CDOptDefaultSelected in PRODINFO structure
  863. '' Write: SUB Reg_ReSetCDOptionSelected
  864. ''  SUB Reg_ReSetCDOptionSelectedToDefault
  865. ''  SUB Reg_ReSetAllOptSelToDefaults
  866. '' all functions for cd settings checking and change the funcs that populates 
  867. '' 
  868. ''    Rev 1.43   02 Aug 1994 11:17:58   mzgripce
  869. '' To fix Node Options bug I commented out the call to the sub
  870. '' Reg_ReSetAllNodeOptsToDefaults in the function 
  871. '' Lot_AreAnyNodeOptAvailToSrv()
  872. '' 
  873. ''    Rev 1.42   21 Jul 1994 18:09:34   thangv
  874. '' Modified return value of IsNotesinpath to be 1  if it is not in
  875. '' lotus.ini. (this will reduce the ocuurences of autoexec change dialog
  876. '' showing up).
  877. '' 
  878. ''    Rev 1.41   13 Jun 1994 17:20:12   cmoy
  879. '' 
  880. '' ADDED GETBOOTDRIVE FUNCTIONALITY
  881. '' 
  882. ''    Rev 1.40   08 Jun 1994 17:05:12   mmeth
  883. '' Fixed PopulateCINSTALLLIST.  The bug in here was that we weren't writing ov
  884. '' previous versions of cinstall.ini correctly. gNCINSTALL set to -1 instead o
  885. '' 
  886. ''    Rev 1.39   05 Jun 1994 20:21:36   ptilton
  887. '' Added Global Subroutines for Setting OracleHomeDir & NotesDataDir
  888. '' Symbols.  Moved functions for determining values for symbols from 
  889. '' SHARE.LSS
  890. '' 
  891. ''    Rev 1.38   02 Jun 1994 12:35:32   thangv
  892. '' 
  893. '' Added TrimNetlotusapp function.
  894. '' 
  895. ''    Rev 1.37   31 May 1994 14:04:54   thangv
  896. '' 
  897. '' Added Showwaitcursor and restorecursor foe fine check in CheckforSpace.
  898. '' 
  899. ''    Rev 1.36   31 May 1994 13:40:04   mmeth
  900. '' Added Function Calls for Suite to handle previous versions
  901. '' 
  902. ''    Rev 1.35   26 May 1994 07:25:00   mmeth
  903. '' In CheckForSpace the variable notused1$ was refernced, but not declared.
  904. '' 
  905. ''    Rev 1.34   25 May 1994 17:10:12   cmoy
  906. '' 
  907. '' put up a please wait dialog in CheckForSpace
  908. '' 
  909. ''    Rev 1.33   24 May 1994 16:54:16   thangv
  910. '' Set the tab to 50 from 75 in CheckForSpace.
  911. '' 
  912. ''    Rev 1.32   24 May 1994 15:47:18   mmeth
  913. '' Fixed Performance problem having to do with reading and writing CINSTALL.IN
  914. '' 
  915. ''    Rev 1.31   23 May 1994 14:50:02   mzgripce
  916. '' fix a bug in IsThe Featureinstalled 
  917. '' 
  918. ''    Rev 1.30   20 May 1994 17:24:44   mmeth
  919. '' Modified Lot_IsTheFeatureInstalled. It uses a list (CINSTALL) and
  920. '' works faster.
  921. '' 
  922. ''    Rev 1.29   12 May 1994 11:20:24   mmeth
  923. '' Adding Icons for Lic and Install and using DoMsgBox instead of MessageBox
  924. '' 
  925. ''    Rev 1.28   29 Apr 1994 16:36:36   mzgripce
  926. '' 
  927. '' fixed spr # 28650
  928. '' 
  929. ''    Rev 1.27   28 Apr 1994 13:29:38   mzgripce
  930. '' 
  931. '' added Lot_IsDestVerNewerOrEqual()
  932. '' 
  933. ''    Rev 1.26   21 Apr 1994 15:32:40   mzgripce
  934. '' 
  935. '' implement the correct err message for too long path(SID_ERR_PATHLEN_...)
  936. '' 
  937. ''    Rev 1.25   20 Apr 1994 16:45:38   thangv
  938. '' Modified Lot_AreAnyNodeOptionsAvailToSrv function to check
  939. '' for any node options not being in the copylist.
  940. '' 
  941. ''    Rev 1.24   20 Apr 1994 16:23:20   mzgripce
  942. '' 
  943. '' Reject paths that are too long.
  944. '' 
  945. ''    Rev 1.23   19 Apr 1994 10:28:32   thangv
  946. '' Added FremoveSymbol(IDC_TEXT) in Popupmodal function
  947. '' when exit button is selected.
  948. '' 
  949. ''    Rev 1.22   13 Apr 1994 09:55:28   cmoy
  950. '' 
  951. '' Added SHAREEXE and Notes as fields in Registration Database
  952. '' Added SUBS:
  953. '' Reg_SetSHAREEXESupport
  954. '' Reg_SetNotesSupport
  955. '' Added FUNCTIONS:
  956. '' Reg_GetSHAREEXESupport
  957. '' Reg_GetNotesSupport
  958. '' GetNotesPathfromLotusIni
  959. '' IsNotesInPath
  960. '' IsShareInAUTOEXEC
  961. '' ModifyAutoexec
  962. '' GetBootDrive
  963. '' Added Constants
  964. '' MANotes
  965. '' MAShare
  966. '' 
  967. ''    Rev 1.21   07 Apr 1994 16:41:12   mmeth
  968. '' changed return code for EXECUTE statement to a public variable
  969. '' 
  970. ''    Rev 1.20   07 Apr 1994 12:38:20   mmeth
  971. '' Modified DOEXEC to EXECUTE.
  972. '' 
  973. ''    Rev 1.19   06 Apr 1994 16:28:06   mmeth
  974. '' Added a list gEXTRA.  This list gets initialized with an etra 200000
  975. '' bytes for the Windows drive.  This can be modified by the product groups if
  976. '' necessary. 
  977. '' 
  978. ''    Rev 1.18   04 Apr 1994 18:02:18   mmeth
  979. '' Took out share.lss depednancies for those products that don't need it.
  980. '' 
  981. ''    Rev 1.17   23 Mar 1994 10:11:08   mmeth
  982. '' WhereIsFeature... fixed for SmartSuiteNode case &
  983. '' SaveFeatureInstalled... was fixedso it would write without adding extra "\"
  984. '' 
  985. ''    Rev 1.16   23 Mar 1994 09:17:52   mzgripce
  986. '' add LOOKONNETLOTUSAPP to whereIsFeature 
  987. '' 
  988. ''    Rev 1.15   18 Mar 1994 18:30:50   mzgripce
  989. '' change Lot_WhereIsFeature and save Destination Directories for suit server
  990. '' 
  991. ''    Rev 1.14   11 Mar 1994 16:58:56   thangv
  992. '' Added the Dist field in the Registration database
  993. '' Added The Reg_Set.. and Reg_GetProd.. functions for dist.
  994. '' 
  995. ''    Rev 1.13   10 Mar 1994 17:24:54   mzgripce
  996. '' add Lot_InitializeWinWinsysSym subroutine
  997. '' 
  998. ''    Rev 1.12   01 Mar 1994 17:08:30   mzgripce
  999. '' CALL FIsKeywordInCopyList into Lot_SaveNodeOptionsInInstallIni
  1000. '' 
  1001. ''    Rev 1.11   01 Mar 1994 12:13:14   mzgripce
  1002. '' added NodeOptDefaultSelected to PRODINFO type def
  1003. '' change: Reg_RegisterProductNames and Reg_SetNodeOptionSelected
  1004. '' added: Reg_IsNodeOptionDefaultSelected
  1005. ''        Reg_ReSetNodeOptionSelectedToDefault
  1006. ''        Reg_ReSetNodeOptionSelected and
  1007. ''        Reg_ReSetAllNodeOptsSelToDefaults
  1008. '' 
  1009. ''    Rev 1.10   24 Feb 1994 12:56:12   tingmann
  1010. '' add lot_lcbsettabs
  1011. '' 
  1012. ''    Rev 1.9   23 Feb 1994 18:14:30   mzgripce
  1013. '' fix Lot_SaveTheNodeOptionsInInstallIni() (replace"1" with STR(1))
  1014. '' 
  1015. ''    Rev 1.8   22 Feb 1994 17:04:24   mzgripce
  1016. '' add Lot_AreAnyNodeOptAvailToSrv()
  1017. '' 
  1018. ''    Rev 1.7   17 Feb 1994 10:24:46   mmeth
  1019. '' Added Reg_SetAllowUserToChoseInSMartSUite
  1020. '' 
  1021. ''    Rev 1.6   16 Feb 1994 14:40:06   tingmann
  1022. '' add reg_getproductname,reg_getuiinorout, lot_lcbsetsel
  1023. '' 
  1024. ''    Rev 1.5   16 Feb 1994 12:13:46   tingmann
  1025. '' fix END statement problem when running from DOEXEC (in QUIT sub)
  1026. '' 
  1027. ''    Rev 1.4   15 Feb 1994 15:01:38   mmeth
  1028. '' added pvcs line for toolkit.lss &
  1029. ''
  1030. ''   Creation Date: Wednesday January 5, 1994
  1031. ''
  1032. ''   Copyright Lotus Development Corporation, (c) 1994
  1033. ''
  1034. ''
  1035. ''   Description:
  1036. ''      
  1037. ''
  1038. ''   Additional authors: MZ
  1039. ''
  1040. ''   Change History:
  1041. ''----------------------------------------------------------------------
  1042. ''   Date     Vers. Pgmr  SPR#  Change
  1043. ''----------------------------------------------------------------------
  1044. '' 02-16-94   0032  MZ         Added Lot_AreAnyNodeOptAvailToSrv()
  1045. ''!
  1046. '' 02-16-94   0031  TQI           Fix exit problem when calling QUIT during DOEXEC
  1047. '' 02-14-94   0030  MZ          Added Lot_IsAnyNodeOptAvailToNode() and
  1048. ''                              Lot_AreNodeOptAvailToNodeForProd()
  1049. ''                              Lot_GetNumOfNodeOptAvailToNodeForProd()
  1050. '' 02-11-94   0029  MZ          Added Lot_SaveTheNodeOptionsInInstallIni(),
  1051. ''                              Lot_GetLastNodeOptNumber() and
  1052. ''                              Lot_IsTheNodeOptionsAvailToNode() functions
  1053. '' 02-07-94   0028  MZ          move Lot_SaveFeaturesInstaledInInstallIni()
  1054. ''                              and Lot_GetLastFeatureNumber() from share.lss
  1055. '' 02-06-94   0027  MMETH       fixed Lot_Toggle... and MsgBox-> MessageB
  1056. '' 02-04-94   0026  MMETH       Added defaults for Reg DB.
  1057. '' 02-03-94   0025  MMETH       added Lot_WhereIsFeature also moved 
  1058. ''                              Lot_IstheFeatureInstall from toolkit.lss
  1059. '' 02-01-94   0024  MZ          ADDED Lot_GetGroupName and set
  1060. ''                              Prods(gCurrNumOfProds%).ProgManagerGroup="Lotus Applications"
  1061. '' 02-01-94   0024  MMETH       INSTALL_SOURCE still coming up empty.
  1062. '' 01-31-94   0023  MMETH       Cleaned up CallProductFunctions and Back
  1063. '' 01-30-94   0022  MMETH       Removed CreateCOuntDir from remmed out code
  1064. '' 01-28-94   0021  MZ          Add:Reg_SetLicenseSelected
  1065. ''                                  Reg_IsLicenseSelected
  1066. ''                                  Reg_SetCountDirectory
  1067. ''                                  Reg_GetCountDirectory
  1068. ''                                  Reg_SetBillboardNumber
  1069. ''                                  Reg_GetBillboardNumber
  1070. ''                              Change Reg_RegisterProductNames to set the 
  1071. ''                              BillboardNumber to 0
  1072. '' 01-28-94   0022  MMETH       Fixed CallProducts for "BACK"
  1073. '' 01-28-94   0021  DND         Added Reg_GetSystemFileSize and
  1074. ''                              Reg_SetSystemFileSize.
  1075. '' 01-27-94   0020  DND         Lot_GetChapterValStr returns empty
  1076. ''                              string if chapter is not found.
  1077. '' 01-25-94   0019  DND         Move SetRestartDir, RestartListEmpty,
  1078. ''                              and ExitExecRestart from setupapi.
  1079. '' 01-25-94   0018  MMETH       Added Lot_TrimEndSlash
  1080. '' 01-24-94   0017  MMETH       Fix GetTheRealProdDir
  1081. '' 01-24-94   0016  TQI         Capture function returns (lsi36)
  1082. '' 01-24-94   0015  MMETH       Move GetTheRealProd from share.lss
  1083. ''                              added prodno% parm, and modified implememntaion
  1084. '' 01-21-94   0014  MMETH       Added Parms to Lot_CallProducts
  1085. '' 01-20-94   0013  DND         CheckForSpace no longer pops modeless
  1086. '' 01-20-94   0012  MZ          Modify Reg_SetSelectedInstallType() to set to 
  1087. ''                              complete if custom and/or laptop is not a
  1088. ''                              valid choice for the product.
  1089. '' 01-19-94   0011  DND         Modified the GetFirstDrive functions so
  1090. ''                              they now return with the default dir.
  1091. ''                              Made the AllDrive function more effecient.
  1092. '' 01-19-94   0010  MMETH       Changed CallProd family to use Reg_GetProductAcronym
  1093. '' 01-19-94   0009  MZ          Change TRUE/FALSE to 1/0 in Reg_* SUB/FUNCs
  1094. '' 01-19-94   0009  MMeth       Use SYM_UPDATELIST$. 
  1095. ''                              Added Reg_GetNumberOfProducts.
  1096. '' 01-19-94   0008  DND         Lot_Get/SetCurrentProduct saves and returns
  1097. ''                              an integer. This makes life much easier
  1098. ''                              for toolkit. Changed 
  1099. ''                              Reg_SetSelectedInstallTypes to
  1100. ''                              Reg_SetSelectedInstallType. Fixed 
  1101. ''                              SelectDriveCombo to accept a path.
  1102. ''                              Lot_ExtractDriveLetter returns lower case.
  1103. '' 01-19-94   0008  TQI         Use doexec instead of execute
  1104. '' 01-18-94   0007  MZ          move Lot_CleanPath() to setupapi.lss
  1105. '' 01-18-94   0006  MZ          Put in the Product registration database
  1106. '' 01-18-94   0005  DND         Added Lot_CleanPath
  1107. '' 01-12-94   0004  MMETH       Changed Return code of CallProd to string
  1108. '' 01-12-94   0003  mmeth            Lot_CallProductFunctions (func_name$, always%, parms$)
  1109. '' 01-12-94   0002  tqi         option declare
  1110. '' 01-10-94   0001  MZ          Make all symbols Constants and put them
  1111. ''                              in GLOBALS.LSS
  1112. '' 01-05-94   0000  DND         Initial checkin
  1113. ''----------------------------------------------------------------------
  1114. ''
  1115. ''**********************************************************************
  1116.  
  1117. 'USE "SETUPAPI"
  1118. USE "START"
  1119. USE "REGISTER"
  1120. OPTION DECLARE
  1121. '************ User messages
  1122.  
  1123. PUBLIC CONST WM_COMMAND        = 273
  1124. PUBLIC CONST WM_USER           = 1024
  1125. PUBLIC CONST UM_PAINTMODELESS  = (WM_USER+1000)
  1126. PUBLIC CONST UM_REBOOTFLAG     = (WM_USER+503)
  1127. PUBLIC CONST UM_RESTARTWINDOWS = (WM_USER+504)
  1128.  
  1129.  
  1130. '** Return codes for drive type
  1131. PUBLIC CONST DRIVE_REMOVABLE = 2
  1132. PUBLIC CONST DRIVE_FIXED     = 3
  1133. PUBLIC CONST DRIVE_REMOTE    = 4
  1134.  
  1135. '** Function return codes
  1136. PUBLIC CONST SUCCESS = 1
  1137. PUBLIC CONST FAILURE = 0
  1138. PUBLIC CONST MANotes = 1   '** used in ModifyAutoexec
  1139. PUBLIC CONST MAShare = 2   '** used in ModifyAutoexec
  1140.  
  1141. '** These numbers must match those in lcomstf\sections.h of lcomstf.dll!!
  1142. PUBLIC CONST F_NOTHING    = 0
  1143. PUBLIC CONST F_CHAPTER    = 1
  1144. PUBLIC CONST F_NAME       = 2
  1145. PUBLIC CONST F_INOROUT    = 4
  1146. PUBLIC CONST F_DISPLAY    = 8
  1147. PUBLIC CONST F_COMPLETE   = 16
  1148. PUBLIC CONST F_LAPTOP     = 32
  1149. PUBLIC CONST F_CUSTOM     = 64
  1150. PUBLIC CONST F_TIPS       = 128
  1151. PUBLIC CONST F_HELP       = 256
  1152. PUBLIC CONST F_DESTDIR    = 512
  1153. PUBLIC CONST F_BITMAP     = 1024
  1154. PUBLIC CONST F_EXCEPTION  = 2048
  1155. PUBLIC CONST F_SHARE      = 4096
  1156. PUBLIC CONST F_KEYWORD    = 8192
  1157. PUBLIC CONST F_DESTDIRSYM = 16384
  1158.  
  1159. PUBLIC CONST RT_BITMAP  = 2     'This should be a MAKEINTRESOURCE(2) really
  1160. PUBLIC CONST RT_DIALOG  = 5     'This should be a MAKEINTRESOURCE(5) really
  1161. PUBLIC CONST RT_STRING  = 6     'This should be a MAKEINTRESOURCE(6) really
  1162.  
  1163. 'The decorated name for the generic dialog procedure in dlgproc.c  JMD
  1164. PUBLIC CONST FNAMEORGDLGPROC$="_FNameOrgDlgProc@16"
  1165.  
  1166. 'needed in callbacks
  1167. PUBLIC CONST MAX_NO_DRIVECOMBOS = 4
  1168.  
  1169. '*****
  1170. 'NEEDED FOR THE ARRAY CINSTALL
  1171. DECLARE SUB PopulateCINSTALLLIST
  1172. DIM CINSTALL LIST AS STRING
  1173. DIM gNCINSTALL%
  1174.  
  1175. 'NEEDED FOR THE ARRAY CINSTNODE
  1176. DECLARE SUB PopulateCINSTNODELIST
  1177. DIM CINSTNODE LIST AS STRING
  1178. DIM gNCINSTNODE%
  1179.  
  1180. 'NEEDED FOR THE ARRAY COBJECT
  1181. DECLARE SUB PopulateCOBJECTLIST(iniPath$)
  1182. DIM COBJECT LIST AS STRING
  1183.         
  1184. %rem
  1185.  Moved to register.lss
  1186. '******************** Product Registration  struc, array and count *********
  1187. TYPE PRODINFO
  1188.    Acronym                    AS STRING
  1189.    Name                       AS STRING
  1190.    Complete                   AS INTEGER
  1191.    Custom                     AS INTEGER
  1192.    Laptop                     AS INTEGER
  1193.    SelectedType               AS STRING
  1194.    UIInOrOut                  AS INTEGER
  1195.    AllowUserToPickInSuite     AS INTEGER
  1196.    FullSize                   AS LONG
  1197.    MinSize                    AS LONG
  1198.    Share                      AS INTEGER
  1199.    Share32                    AS INTEGER
  1200.    DataLens                   AS INTEGER
  1201.    SQL                        AS INTEGER
  1202.    Paradox                    AS INTEGER
  1203.    CDOpt                      AS STRING
  1204.    CDOptSelected              AS STRING
  1205.    CDOptDefaultSelected       AS STRING
  1206.    NodeOpt                    AS STRING
  1207.    NodeOptSelected            AS STRING
  1208.    NodeOptDefaultSelected     AS STRING
  1209.    Srv                        AS INTEGER
  1210.    Dist                       AS INTEGER
  1211.    ExtraProdDirsNum           AS INTEGER
  1212.    License                    AS INTEGER
  1213.    LicenseSelected            AS INTEGER
  1214.    CountDirectory             AS STRING
  1215.    ATM                        AS INTEGER
  1216.    DirSymList                 AS STRING         'Should be populated in Init
  1217.    ProgManagerGroup           AS STRING
  1218.     ProgFolder                                              AS STRING
  1219.    SystemFileSize             AS LONG
  1220.    BillboardNumber            AS INTEGER
  1221.    SHAREEXE                   AS INTEGER
  1222.    Notes                      AS INTEGER
  1223.    PreviousVersion            AS STRING      'This is a string for future purposes
  1224.    MoreDirsCBName             AS STRING
  1225.    MoreDirsDlgID              AS INTEGER
  1226.    MoreDirsHlpID              AS LONG
  1227.    ObsoleteFiles              AS INTEGER      'This is can be a string for future enhancements
  1228. END TYPE
  1229.  
  1230. DIM Prods(gMaxNumOfProds) AS PRODINFO  
  1231. DIM gCurrNumOfProds%                      '** Number of products
  1232. DIM gCurrentProduct%                      '** The current product
  1233. %endrem
  1234.  
  1235. '******************** Lotus DLL interface **************************
  1236.  
  1237. DECLARE PUBLIC FUNCTION FIsKeywordInCopyList LIB "lcomstf.dll" ALIAS "_FIsKeywordInCopyList@4" (ByVal szKeyword$) AS LONG
  1238. DECLARE PUBLIC FUNCTION FGetChapterFromKeyword LIB "lcomstf.dll" ALIAS "_FGetChapterFromKeyword@12" (ByVal szKeyword$, ByVal szChptname$, ByVal cbChptsize&) AS LONG
  1239. DECLARE PUBLIC FUNCTION FRemoveDir LIB "lcomstf.dll" ALIAS "_FRemoveDir@4" (ByVal szDir$) AS LONG
  1240. DECLARE PUBLIC FUNCTION FOpenInf LIB "lcomstf.dll" ALIAS "_FOpenInf@12" (ByVal szFile$,ByVal fCheck&,ByVal fCheckSyms&) AS LONG
  1241. DECLARE PUBLIC FUNCTION LcbGetChapterCost LIB "lcomstf.dll" ALIAS "_LcbGetChapterCost@16" (ByVal szchapter$,ByVal szextra$,ByVal szcost$, ByVal szneed$) AS LONG
  1242. DECLARE PUBLIC FUNCTION CbGetInfSectionKeyField LIB "lcomstf.dll" ALIAS "_CbGetInfSectionKeyField@20" (ByVal szSect$, ByVal szKey$, ByVal iField&, ByVal szBuf$, ByVal cbBuf&) AS LONG
  1243. DECLARE PUBLIC FUNCTION FMakeListInfSectionField LIB "lcomstf.dll" ALIAS "_FMakeListInfSectionField@12" (ByVal szSym$, ByVal szSect$, ByVal iField&) AS LONG
  1244. DECLARE PUBLIC FUNCTION FSetSymbolToListOfInfKeys LIB "lcomstf.dll" ALIAS "_FSetSymbolToListOfInfKeys@12" (ByVal szSym$, ByVal szSect$, ByVal fNulls&) AS LONG
  1245. DECLARE PUBLIC FUNCTION FAddSectionFilesToCopyList LIB "lcomstf.dll" ALIAS "_FAddSectionFilesToCopyList@12" (ByVal szSect$, ByVal szSrc$, ByVal szDest$) AS LONG
  1246. DECLARE PUBLIC FUNCTION FAddSectionKeyFileToCopyList LIB "lcomstf.dll" ALIAS "_FAddSectionKeyFileToCopyList@16" (ByVal szSect$, ByVal szKey$, ByVal szSrc$, ByVal szDest$) AS LONG
  1247. DECLARE PUBLIC FUNCTION FDumpCopyListToFile LIB "lcomstf.dll" ALIAS "_FDumpCopyListToFile@4" (ByVal szFile$) AS LONG
  1248. DECLARE PUBLIC SUB      ResetCopyList LIB "lcomstf.dll" ALIAS "_ResetCopyList@0" ()
  1249. DECLARE PUBLIC SUB      ResetFileCosts LIB "lcomstf.dll" ALIAS "_ResetFileCosts@0" ()
  1250. DECLARE PUBLIC FUNCTION FRemoveSectionFilesFromCopyList LIB "lcomstf.dll" ALIAS "_FRemoveSectionFilesFromCopyList@4" (ByVal szSect$) AS LONG
  1251. DECLARE PUBLIC FUNCTION FRemoveSectionKeyFileFromCopyList LIB "lcomstf.dll" ALIAS "_FRemoveSectionKeyFileFromCopyList@8" (ByVal szSect$, ByVal szKey$) AS LONG
  1252. DECLARE PUBLIC FUNCTION FSetBeepingMode LIB "lcomstf.dll" ALIAS "_FSetBeepingMode@4" (ByVal mode&) AS LONG
  1253. DECLARE PUBLIC SUB      ProSetPos LIB "lcomstf.dll" ALIAS "_ProSetPos@8" (ByVal x&, ByVal y&)
  1254. DECLARE PUBLIC FUNCTION GrcCopyFilesInCopyList LIB "lcomstf.dll" ALIAS "_GrcCopyFilesInCopyList@4" (ByVal hInstance&) AS LONG
  1255. DECLARE PUBLIC FUNCTION LcbGetCopyListCost LIB "lcomstf.dll" ALIAS "_LcbGetCopyListCost@12" (ByVal szExtraList$, ByVal szCostList$, ByVal szNeedList$) AS LONG
  1256. DECLARE PUBLIC FUNCTION FAddToBillboardList LIB "lcomstf.dll" ALIAS "_FAddToBillboardList@16" (ByVal szDll$, ByVal idDlg&, ByVal szProc$, ByVal lTicks&) AS LONG
  1257. DECLARE PUBLIC FUNCTION FClearBillboardList LIB "lcomstf.dll" ALIAS "_FClearBillboardList@0" () AS LONG
  1258. DECLARE PUBLIC FUNCTION SetCopyMode LIB "lcomstf.dll" ALIAS "_SetCopyMode@4" (ByVal fMode&) AS LONG
  1259. DECLARE PUBLIC FUNCTION GetCopyMode LIB "lcomstf.dll" ALIAS "_GetCopyMode@0" () AS LONG
  1260. DECLARE PUBLIC FUNCTION SetSizeCheckMode LIB "lcomstf.dll" ALIAS "_SetSizeCheckMode@4" (ByVal scmMode&) AS LONG
  1261. DECLARE PUBLIC FUNCTION LcbGetInfSectionSize LIB "lcomstf.dll" ALIAS "_LcbGetInfSectionSize@4" (ByVal szSect$)  AS LONG
  1262. DECLARE PUBLIC FUNCTION FSetSilent LIB "lcomstf.dll" ALIAS "_FSetSilent@4" (ByVal mode&) AS LONG
  1263. DECLARE PUBLIC FUNCTION ReadSerialNumber LIB "lcomstf.dll" ALIAS "_ReadSerialNumber@8" (ByVal szSrc$,ByVal szSerial$) AS LONG
  1264. DECLARE PUBLIC FUNCTION WriteUserRegistration LIB "lcomstf.dll" ALIAS "_WriteUserRegistration@16" (ByVal szRi$,ByVal szUser$,ByVal szCompany$,ByVal szSerial$) AS LONG
  1265. DECLARE PUBLIC FUNCTION ReadUserRegistration LIB "lcomstf.dll" ALIAS "_ReadUserRegistration@16" (ByVal szRi$,ByVal szUser$,ByVal szCompany$,ByVal szSerial$) AS LONG
  1266. DECLARE PUBLIC FUNCTION FPopulateLCB LIB "lcomstf.dll" ALIAS "_FPopulateLCB@8" (ByVal hDlg&,ByVal Chapter$) AS LONG
  1267. DECLARE PUBLIC FUNCTION FSetDateOfFile LIB "lcomstf.dll" ALIAS "_FSetDateOfFile@8" (ByVal szFile$,ByVal szDate$) AS LONG
  1268. DECLARE PUBLIC FUNCTION FGetFirstChild LIB "lcomstf.dll" ALIAS "_FGetFirstChild@12" (ByVal szChapter$,ByVal szFirsthapter$, ByVal nField&) AS LONG
  1269. DECLARE PUBLIC FUNCTION FGetFirst LIB "lcomstf.dll" ALIAS "_FGetFirst@12" (ByVal szChapter$,ByVal szFirsthapter$, ByVal nField&) AS LONG
  1270. DECLARE PUBLIC FUNCTION FGetChapterValStr LIB "lcomstf.dll" ALIAS "_FGetChapterValStr@16" (ByVal szChapter$,ByVal nField&, ByVal szBuf$,ByVal cbBuf&) AS LONG
  1271. DECLARE PUBLIC FUNCTION FGetChapterValInt LIB "lcomstf.dll" ALIAS "_FGetChapterValInt@12" (ByVal szChapter$,ByVal nField&, lpVal&) AS LONG
  1272. DECLARE PUBLIC FUNCTION FGetNextSibling LIB "lcomstf.dll" ALIAS "_FGetNextSibling@12" (ByVal szChapter$,ByVal szNextChapter$,ByVal nField&) AS LONG
  1273. DECLARE PUBLIC FUNCTION FGetNextChild LIB "lcomstf.dll" ALIAS "_FGetNextChild@4" (ByVal szNextChildChapter$) AS LONG
  1274. DECLARE PUBLIC FUNCTION FGetNext LIB "lcomstf.dll" ALIAS "_FGetNext@4" (ByVal szNextChapter$) AS LONG
  1275. DECLARE PUBLIC FUNCTION FToggleChapterFilesInCopyList LIB "lcomstf.dll" ALIAS "_FToggleChapterFilesInCopyList@4" (ByVal szChapter$) AS LONG
  1276. DECLARE PUBLIC FUNCTION LcbGetInfChapterSize LIB "lcomstf.dll" ALIAS "_LcbGetInfChapterSize@4" (ByVal szChapter$)  AS LONG
  1277. DECLARE PUBLIC FUNCTION FInitializeCopyList LIB "lcomstf.dll" ALIAS "_FInitializeCopyList@12" (ByVal szChpt$, ByVal szSourcedir$, ByVal nField&) AS LONG
  1278. DECLARE PUBLIC FUNCTION FRefreshDestination LIB "lcomstf.dll" ALIAS "_FRefreshDestination@4" (ByVal lpszSym$) AS LONG 
  1279. DECLARE PUBLIC FUNCTION FWriteDestinationSymAndVal LIB "lcomstf.dll" ALIAS "_FWriteDestinationSymAndVal@8" (ByVal lpszIniFile$,ByVal lpszIniSec$) AS LONG 
  1280. DECLARE PUBLIC FUNCTION FSetRestartDir LIB "lcomstf.dll" ALIAS "_FSetRestartDir@4" (ByVal szDir$) AS LONG
  1281. DECLARE PUBLIC FUNCTION FRestartListEmpty LIB "lcomstf.dll" ALIAS "_FRestartListEmpty@0" () AS LONG
  1282. DECLARE PUBLIC FUNCTION FExitExecRestart LIB "lcomstf.dll" ALIAS "_FExitExecRestart@0" () AS LONG
  1283. DECLARE PUBLIC FUNCTION Lot_CreateConsoleProcess LIB "lcomstf.dll" ALIAS "_Lot_CreateConsoleProcess@8" (ByVal lpExeName$, ByVal lpCommandLine$) AS INTEGER
  1284. DECLARE PUBLIC FUNCTION FGetSectionFileList LIB "lcomstf.dll" ALIAS "_FGetSectionFileList@12" (ByVal lpszSym$, ByVal lpszSection$, ByVal RenameFlag%) AS INTEGER
  1285.  
  1286. '****************  Tabs UI Declarations  *********************************
  1287.  
  1288. DECLARE PUBLIC FUNCTION DriveType LIB "mscuistf.dll" ALIAS "_DriveType@4" (ByVal drivetype&) AS LONG
  1289. DECLARE PUBLIC FUNCTION RegisterFunction LIB "mscuistf.dll"  ALIAS "_RegisterFunction@12" (ByVal sess&, ByVal modname$, ByVal fname$) AS INTEGER
  1290. DECLARE PUBLIC FUNCTION NotebookAddDlgPage LIB "mscuistf.dll" ALIAS "_NotebookAddDlgPage@24" (ByVal  hDlg&,_
  1291.     ByVal idNotebook&, ByVal  idDlg&, ByVal lpszDllName$, ByVal lpszDlgProc$,_
  1292.     ByVal lpszTab$) AS LONG
  1293. DECLARE PUBLIC FUNCTION FNotebookPageView LIB "mscuistf.dll" ALIAS "_FNotebookPageView@16" (ByVal hDlg&,_
  1294.           ByVal idNotebook&, ByVal  idDlg&, ByVal fShowPage&) AS LONG
  1295. DECLARE PUBLIC FUNCTION FNotebookTurnToPage LIB "mscuistf.dll" ALIAS "_FNotebookTurnToPage@12" (ByVal hDlg&,ByVal idNotebook&,ByVal id&) AS LONG
  1296. DECLARE PUBLIC FUNCTION NotebookGetPageHwnd LIB "mscuistf.dll" ALIAS "_NotebookGetPageHwnd@12" (ByVal hDlg&,ByVal idNotebook&,ByVal idPage&) AS LONG
  1297. DECLARE PUBLIC SUB      LCBResetContent LIB "mscuistf.dll" ALIAS "_LCBResetContent@4" (ByVal hDlg&)
  1298. DECLARE PUBLIC SUB      LCBSetRedraw LIB "mscuistf.dll" ALIAS "_LCBSetRedraw@8" (ByVal hDlg&, ByVal fRedraw&)
  1299. DECLARE PUBLIC FUNCTION LCBGetCount LIB "mscuistf.dll" ALIAS "_LCBGetCount@4" (ByVal hDlg&) AS LONG
  1300. DECLARE PUBLIC FUNCTION LCBAddItem LIB "mscuistf.dll" ALIAS "_LCBAddItem@8" (ByVal hDlg&, ByVal item$) AS LONG
  1301. DECLARE PUBLIC FUNCTION LCBReplaceItem LIB "mscuistf.dll" ALIAS "_LCBReplaceItem@16" (ByVal hDlg&, ByVal index&, ByVal itemnum&, ByVal item$) AS LONG
  1302. DECLARE PUBLIC FUNCTION LCBGetItem LIB "mscuistf.dll" ALIAS "_LCBGetItem@20" (ByVal hDlg&, ByVal index&, ByVal itemnum&, ByVal item$, ByVal itemmax&) AS LONG
  1303. DECLARE PUBLIC FUNCTION LCBToggleItem LIB "mscuistf.dll" ALIAS "_LCBToggleItem@8" (ByVal hDlg&, ByVal index&) AS LONG
  1304. DECLARE PUBLIC SUB      LCBSetSel LIB "mscuistf.dll" ALIAS "_LCBSetSel@8" (ByVal hDlg&, ByVal index&) 
  1305. DECLARE PUBLIC SUB      LCBSetTabs LIB "mscuistf.dll" ALIAS "_LCBSetTabs@20" (ByVal hDlg&, ByVal t1&,ByVal t2&,ByVal t3&,ByVal t4&)
  1306. DECLARE PUBLIC FUNCTION FGetDriveFreeSpaceList LIB "mscuistf.dll" ALIAS "_FGetDriveFreeSpaceList@4" (ByVal szSymbol$) AS LONG
  1307.  
  1308. '** UNC stuff
  1309. DECLARE PUBLIC FUNCTION FAddToDriveFreeSpaceList LIB "mscuistf.dll" ALIAS "_FAddToDriveFreeSpaceList@8" (ByVal szSymbol$,ByVal szNewItem$) AS LONG
  1310. DECLARE PUBLIC FUNCTION FIsUnvalidatedUNCPath LIB "mscuistf.dll" ALIAS "_FIsUnvalidatedUNCPath@4" (ByVal szPath$) AS LONG
  1311. DECLARE PUBLIC FUNCTION FIsValidUNCPath LIB "mscuistf.dll" ALIAS "_FIsValidUNCPath@4" (ByVal szPath$) AS LONG
  1312. DECLARE PUBLIC FUNCTION FGetGroupName LIB "mscuistf.dll" ALIAS "_FGetGroupName@12" (ByVal szGroupFileName$, ByVal szBuf$,ByVal cbBuf&) AS LONG
  1313. DECLARE PUBLIC FUNCTION RemovePriorVersion(ProdRegKeyName$,ProdVer$) AS INTEGER
  1314.  
  1315. '*************** Wrappers for MS functions that Lotus re-wrote **************
  1316.  
  1317. DECLARE PUBLIC SUB      ReadInfFile (szFile$)
  1318. DECLARE PUBLIC SUB      MakeListFromSectionKeys (szSymbol$, szSect$)
  1319. DECLARE PUBLIC SUB      MakeListFromSectionDate (szSym$, szSect$)
  1320. DECLARE PUBLIC SUB      MakeListFromSectionFilename (szSym$, szSect$)
  1321. DECLARE PUBLIC SUB      MakeListFromSectionSize (szSym$, szSect$)
  1322. DECLARE PUBLIC SUB      MakeListFromSectionVersion (szSym$, szSect$)
  1323. DECLARE PUBLIC FUNCTION SetSilentMode (mode%) AS INTEGER
  1324. DECLARE PUBLIC FUNCTION SetBeepingMode (mode%) AS INTEGER
  1325. DECLARE PUBLIC FUNCTION GetSectionKeyDate (szSect$, szKey$) AS STRING
  1326. DECLARE PUBLIC FUNCTION GetSectionKeyFilename (szSect$, szKey$) AS STRING
  1327. DECLARE PUBLIC FUNCTION GetSectionKeySize (szSect$, szKey$) AS LONG
  1328. DECLARE PUBLIC FUNCTION GetSectionKeyVersion (szSect$, szKey$) AS STRING
  1329. DECLARE PUBLIC SUB      RemoveDir (szDir$, cmo%)
  1330. DECLARE PUBLIC SUB      DumpCopyList (szFile$)
  1331. DECLARE PUBLIC SUB      ClearCopyList
  1332. DECLARE PUBLIC FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) AS LONG
  1333. DECLARE PUBLIC SUB      CopyFilesInCopyList
  1334. DECLARE PUBLIC SUB      AddSectionFilesToCopyList (szSect$, szSrc$, szDest$)
  1335. DECLARE PUBLIC SUB      AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$)
  1336. DECLARE PUBLIC SUB      AddToBillboardList (szDll$, idDlg&, szProc$, lTicks&)
  1337. DECLARE PUBLIC SUB      AddBlankToBillboardList (lTicks&)
  1338. DECLARE PUBLIC SUB      ClearBillboardList
  1339. DECLARE PUBLIC SUB      SetCopyGaugePosition (x%, y%)
  1340. DECLARE PUBLIC SUB      SetRestartDir(szDir$)
  1341. DECLARE PUBLIC FUNCTION RestartListEmpty AS INTEGER
  1342. DECLARE PUBLIC FUNCTION ExitExecRestart AS INTEGER
  1343.  
  1344. '** Utility functions
  1345.  
  1346. DECLARE PUBLIC FUNCTION GetAbsPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  1347. DECLARE PUBLIC FUNCTION MakePath (szDir$, szFile$) AS STRING
  1348. DECLARE PUBLIC SUB      ShowPathError (nmsg%, nDescription%, szPath$)
  1349. DECLARE PUBLIC SUB      ShowPathErrorNoDlgExit (nmsg%, nDescription%, szPath$)
  1350. DECLARE PUBLIC FUNCTION IsPathWritable (szPath$) AS INTEGER
  1351. DECLARE PUBLIC FUNCTION ValidatePath (szPath$) AS INTEGER
  1352. DECLARE PUBLIC FUNCTION RegisterCallback (ReturnStr$, FuncName$) AS INTEGER
  1353. DECLARE PUBLIC FUNCTION PopupModalDlg (Dlg%, HelpID&) AS STRING
  1354. DECLARE PUBLIC FUNCTION PopupModelessDlg (Dlg%, HelpID&) AS STRING
  1355. DECLARE PUBLIC FUNCTION SelectDriveCombo (ComboID$, path$) AS INTEGER
  1356. DECLARE PUBLIC FUNCTION CheckForSpace (DlgId%) AS INTEGER
  1357. DECLARE PUBLIC SUB      QUIT
  1358. DECLARE PUBLIC SUB      Lot_WriteDestinationSymAndVal(IniFileName$,IniSection$) 
  1359. DECLARE PUBLIC SUB      Lot_WriteCriticalDirectories (InstallIniFile$)
  1360. DECLARE PUBLIC FUNCTION Lot_WriteToRiFile (ripath$) AS INTEGER
  1361. DECLARE PUBLIC FUNCTION Lot_ReadDefaultsfromRi (default_ripath$) AS INTEGER
  1362. DECLARE PUBLIC FUNCTION Lot_TrimEndSlash (path$) AS STRING
  1363. DECLARE PUBLIC FUNCTION Lot_AreShareToolsSupported () AS INTEGER
  1364. DECLARE PUBLIC FUNCTION Lot_AreShare32ToolsSupported () AS INTEGER
  1365. DECLARE PUBLIC FUNCTION Lot_CallSharedTool (func$) AS INTEGER
  1366. DECLARE PUBLIC FUNCTION GetNotesPathfromLotusIni() AS STRING
  1367. DECLARE PUBLIC FUNCTION IsNotesInPath() AS INTEGER
  1368. DECLARE PUBLIC FUNCTION IsShareInAUTOEXEC() AS INTEGER
  1369. DECLARE PUBLIC FUNCTION ModifyAutoexec(modflag%,directmod%,backup$) AS STRING
  1370. DECLARE PUBLIC FUNCTION GetBootDrive() AS STRING
  1371. DECLARE PUBLIC FUNCTION Lot_GetLotusNotesDataPath() AS STRING
  1372. DECLARE PUBLIC FUNCTION Lot_GetORACLEHomePath() AS STRING
  1373. DECLARE PUBLIC FUNCTION Lot_GetLotusNotesPrgPath() AS STRING
  1374. 'DECLARE PUBLIC FUNCTION GetLotusNotesDataPath(szFile$, szSect$, szKey$) AS STRING
  1375. DECLARE PUBLIC SUB      DL_SetOraclePath
  1376. DECLARE PUBLIC SUB      DL_SetNotesDataPath
  1377. DECLARE PUBLIC FUNCTION TrimNetlotusapp (ByVal path$) AS STRING
  1378. DECLARE PUBLIC FUNCTION GetLastPathComponent( ByVal szPath$) AS STRING
  1379. DECLARE PUBLIC SUB ComboSelChanged(BoxNo&, Inst%)
  1380. DECLARE PUBLIC FUNCTION GetPathFromComboEdit(hDlg&,BoxNo%) AS STRING
  1381. DECLARE PUBLIC FUNCTION OneUp(s$) AS STRING
  1382.  
  1383.  
  1384. '** Lotus functions
  1385.  
  1386. DECLARE PUBLIC FUNCTION Lot_GetLocalHardDrive (ProdSize&,DefaultDir$) AS STRING
  1387. DECLARE PUBLIC FUNCTION Lot_GetNetHardDrive (ProdSize&,DefaultDir$) AS STRING
  1388. DECLARE PUBLIC FUNCTION Lot_GetAllHardDrive(ProdSize&,DefaultDir$) AS STRING
  1389. DECLARE PUBLIC FUNCTION Lot_Dir  (szDir$) AS STRING
  1390. DECLARE PUBLIC FUNCTION Lot_GetChapterFromKeyword (szKeyword$) AS STRING
  1391. DECLARE PUBLIC FUNCTION Lot_CallProductFunctions (func_name$, BYVAL direction$, always%, back$, parms$) AS STRING
  1392. DECLARE PUBLIC FUNCTION Lot_CallOneProductFunction (prodno%, func_name$, BYVAL direction$, always%, parms$) AS STRING
  1393. DECLARE PUBLIC FUNCTION Lot_CheckPath (path$) AS INTEGER
  1394. DECLARE PUBLIC FUNCTION Lot_GetInfSectionSize (szSect$)  AS LONG
  1395. DECLARE PUBLIC SUB      Lot_RemoveSectionFilesFromCopyList (szSect$)
  1396. DECLARE PUBLIC SUB      Lot_RemoveSectionKeyFileFromCopyList (szSect$, szKey$)
  1397. DECLARE PUBLIC FUNCTION Lot_SetDateOfFile (szFile$, szDate$) AS INTEGER
  1398. DECLARE PUBLIC FUNCTION Lot_GetFirst (szChapt$, nFlag%) AS STRING
  1399. DECLARE PUBLIC FUNCTION Lot_GetNext () AS STRING
  1400. DECLARE PUBLIC FUNCTION Lot_AddPagetoNotebook (hDlg&,  Notebookid&, DlgId%,Tabstring$) AS INTEGER
  1401. DECLARE PUBLIC FUNCTION Lot_NotebookPageView (hDlg&,  Notebookid&, DlgId%, fShowPage%) AS INTEGER
  1402. DECLARE PUBLIC SUB      Lot_TurnToPage (hDlg&,Notebookid&, pageid%) 
  1403. DECLARE PUBLIC FUNCTION Lot_GetPagehandle  (hDlg&,Notebookid&,Pageid%) AS LONG
  1404. DECLARE PUBLIC SUB      Lot_LCBResetContent     (hDlg&)
  1405. DECLARE PUBLIC SUB      Lot_LCBSetRedraw        (hDlg&, fRedraw%)
  1406. DECLARE PUBLIC FUNCTION Lot_LCBGetCount    (hDlg&) AS INTEGER
  1407. DECLARE PUBLIC FUNCTION Lot_LCBAddItem     (hDlg&, item$) AS INTEGER
  1408. DECLARE PUBLIC FUNCTION Lot_LCBReplaceItem (hDlg&, index%, itemnum%, item$) AS INTEGER
  1409. DECLARE PUBLIC FUNCTION Lot_LCBGetItem     (hDlg&, index%, itemnum%) AS STRING
  1410. DECLARE PUBLIC FUNCTION Lot_LCBToggleItem  (hDlg&, index%) AS INTEGER
  1411. DECLARE PUBLIC SUB      Lot_LCBSetSel           (hDlg&, index%)
  1412. DECLARE PUBLIC SUB      Lot_LCBSetTabs           (hDlg&, t1%,t2%,t3%,t4%)
  1413. DECLARE PUBLIC FUNCTION Lot_GetFirstChild (szChapt$, nFlag%) AS STRING
  1414. DECLARE PUBLIC FUNCTION Lot_GetChapterValStr (szChapter$, nField%) AS STRING  
  1415. DECLARE PUBLIC FUNCTION Lot_GetChapterValInt (szChapter$,nField%) AS INTEGER  
  1416. DECLARE PUBLIC FUNCTION Lot_GetNextSibling (szChapter$,nField%) AS STRING
  1417. DECLARE PUBLIC FUNCTION Lot_GetNextChild () AS STRING
  1418. DECLARE PUBLIC FUNCTION Lot_GetInfChapterSize (szChapter$)  AS LONG
  1419. DECLARE PUBLIC SUB      Lot_ToggleChapterFilesInCopyList (szChapter$)  
  1420. DECLARE PUBLIC FUNCTION Lot_SetChapterFilesInCopyListInOrOut (szChapter$, InOrOut%)  AS INTEGER
  1421. DECLARE PUBLIC SUB      Lot_InitializeCopyList (chpt$, nField%) 
  1422. DECLARE PUBLIC SUB      Lot_RefreshDestination (symbol$) 
  1423. DECLARE PUBLIC SUB      Lot_GetDriveFreeSpaceList (szSymbol$)
  1424. DECLARE PUBLIC FUNCTION Lot_GetSharedToolsSize() AS INTEGER
  1425. DECLARE PUBLIC FUNCTION Lot_GetShared32ToolsSize() AS INTEGER
  1426. DECLARE PUBLIC FUNCTION Lot_MakeSizeString (size AS LONG) AS STRING
  1427. DECLARE PUBLIC FUNCTION Lot_ExtractDriveLetter (destdir$) AS STRING
  1428. DECLARE PUBLIC FUNCTION Lot_ExtractDirectory (destdir$) AS STRING
  1429. DECLARE PUBLIC FUNCTION Lot_GetGroupName ( szGroupFileName$) AS STRING  
  1430. DECLARE PUBLIC FUNCTION Lot_IsTheFeatureInstalled(s$) AS INTEGER
  1431. DECLARE PUBLIC FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  1432. DECLARE PUBLIC FUNCTION Lot_GetDestDirValueFromInstallini(DestDirSym$) AS STRING
  1433. DECLARE PUBLIC SUB Lot_InitializeWinWinsysSym () 
  1434. DECLARE PUBLIC SUB Lot_InitializeEXTRA ()
  1435. DECLARE PUBLIC FUNCTION Lot_IsDestVerNewerOrEqual(DestinationPath$,SourceVer1&,SourceVer2&,SourceVer3&,SourceVer4&) AS INTEGER
  1436. DECLARE PUBLIC SUB      Lot_CallWinhelp32 (prodno%, network$, SectionName$, DestDirSym$, FileName$) 
  1437. DECLARE PUBLIC SUB Lot_FixupSourceDirectories
  1438. DECLARE PUBLIC SUB MarkFixupSourceDirSymbol(szSubdirSymbol$)
  1439. DECLARE PUBLIC FUNCTION Lot_RegIni(RegFileName$) AS INTEGER
  1440. DECLARE PUBLIC SUB Lot_RegisterFonts()
  1441. DECLARE PUBLIC FUNCTION Lot_RegisterTypeLib(ID$, Version$, Description$, helppath$, filename$, flags%) AS INTEGER
  1442.  
  1443. '** UNC stuff
  1444. DECLARE PUBLIC SUB Lot_SplitUNCPath (szFullPath$, szVol$, szDirPath$)
  1445. DECLARE PUBLIC FUNCTION Lot_AddToDriveFreeSpaceList (szSymbol$, szNewItem$) AS LONG
  1446. DECLARE PUBLIC FUNCTION Lot_IsUnvalidatedUNCPath (szPath$) AS LONG
  1447. DECLARE PUBLIC FUNCTION Lot_IsValidUNCPath (szPath$) AS LONG
  1448. DECLARE PUBLIC FUNCTION FMapUNCVolume LIB "mscuistf.dll" ALIAS "_FMapUNCVolume@8" (ByVal szUNCRoot$, ByVal szDrive$) AS LONG
  1449. DECLARE PUBLIC FUNCTION FUnmapUNCVolume LIB "mscuistf.dll" ALIAS "_FUnmapUNCVolume@4" (ByVal szDrive$) AS LONG
  1450. DECLARE PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  1451. DECLARE PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  1452. '** end UNC stuff
  1453.  
  1454. 'Registration functions moved to REGISTER.LSS
  1455.  
  1456. DECLARE PUBLIC FUNCTION Lot_GetCurrentProduct() AS INTEGER
  1457. DECLARE PUBLIC SUB      Lot_SetCurrentProduct(ProdNo%) 
  1458. DECLARE PUBLIC FUNCTION Lot_GetInstallDir() AS STRING
  1459. DECLARE PUBLIC FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  1460. DECLARE PUBLIC FUNCTION Lot_Readserialnumber () AS INTEGER
  1461. DECLARE PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstallIni() AS INTEGER
  1462. DECLARE PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstNodeIni() AS INTEGER
  1463. DECLARE PUBLIC FUNCTION Lot_SaveTheNodeOptionsInInstallIni() AS INTEGER
  1464. DECLARE PUBLIC FUNCTION Lot_IsTheNodeOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  1465. DECLARE PUBLIC FUNCTION Lot_AreAnyNodeOptionsAvail() AS INTEGER
  1466. DECLARE PUBLIC FUNCTION Lot_IsAnyNodeOptAvailToNode()AS INTEGER
  1467. DECLARE PUBLIC FUNCTION Lot_AreNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  1468. DECLARE PUBLIC FUNCTION Lot_GetNumOfNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  1469. DECLARE PUBLIC FUNCTION Lot_AreAnyNodeOptAvailToSrv() AS INTEGER
  1470.  
  1471. DECLARE PUBLIC FUNCTION Lot_SaveTheCDOptionsInInstallIni() AS INTEGER
  1472. DECLARE PUBLIC FUNCTION Lot_IsTheCDOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  1473. DECLARE PUBLIC FUNCTION Lot_IsAnyCDOptAvailToNode()AS INTEGER
  1474. DECLARE PUBLIC FUNCTION Lot_AreCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  1475. DECLARE PUBLIC FUNCTION Lot_GetNumOfCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  1476. DECLARE PUBLIC FUNCTION Lot_AreAnyCDOptAvailToSrv() AS INTEGER
  1477.  
  1478. '** Win95 uninstaller functions
  1479. DECLARE PUBLIC FUNCTION Lot_RegisterUninstaller(ProdRegKeyName$,ProdVer$,_
  1480.                         ProdDisplayedName$,ProdInfPath$,_
  1481.                         LogFlag%,AutoFlag%,_
  1482.                         LangID$,LogFile$,RspFile$,_
  1483.                         UserName$ ) AS INTEGER
  1484. DECLARE PUBLIC FUNCTION Lot_RegisterObject(FeatureKeyWord$,ClassOfObject$,_
  1485.                         ObjectPath$)
  1486.  
  1487. '** Resource splitting functions
  1488.  
  1489. DECLARE PUBLIC FUNCTION FindResourceinDLL (idDlg&, ResType%) AS STRING
  1490.  
  1491. '** Local functions
  1492.  
  1493. DECLARE PUBLIC SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  1494. DECLARE FUNCTION Lot_GetLastFeatureNumber() AS INTEGER
  1495. DECLARE FUNCTION Lot_GetLastNodeOptNumber(s$) AS INTEGER
  1496. DECLARE FUNCTION Lot_GetLastCDOptNumber(s$) AS INTEGER
  1497. 'Don't make this generally available
  1498. DECLARE FUNCTION AddFontResource LIB "gdi32" alias "AddFontResourceA" (ByVal szFFile$) AS INTEGER
  1499.  
  1500. '** Local globals
  1501.  
  1502. PUBLIC gEndStatementEncountered% ' TRUE when END statement encountered
  1503.  
  1504. '**************************************************************************
  1505.  
  1506. SUB INITIALIZE
  1507. '** Purpose:   Sets the begining of the Product registration array
  1508. '** Arguments:
  1509. '*************************************************************************
  1510.  gCurrNumOfProds% = 0
  1511.  gCurrentProduct% = 1
  1512. ' Moved from main because of symbol initialization in early LdString calls
  1513.  
  1514.    ON Error STFQUIT    GOTO MAINERROR
  1515.    ON Error STFERR     GOTO STFERR_
  1516.    ON Error STFTOGGLE  GOTO STFTOGGLEERR
  1517.  
  1518.     ToolKitInitalizeError& = 0
  1519.     SetUpAPI
  1520.  
  1521.     EXIT SUB
  1522.  
  1523. MAINERROR:
  1524.     ToolKitInitalizeError& = STFQUIT
  1525.     EXIT SUB
  1526.         
  1527. STFERR_:
  1528.     ToolKitInitalizeError& = STFERR
  1529.     EXIT SUB
  1530.  
  1531. STFTOGGLEERR:
  1532.     ToolKitInitalizeError& = STFTOGGLE
  1533.  
  1534. END SUB
  1535.  
  1536. PUBLIC FUNCTION Lot_GetSharedToolsSize() AS INTEGER
  1537. '** Purpose:
  1538. '**     Gets the size of the shared tools in Kb
  1539. '** Arguments:
  1540. '** Returns:
  1541. '**     the size or 0
  1542. '*************************************************************************
  1543.    DIM CurrChpt$, SharedID$, ShareSize&
  1544.  
  1545.    CurrChpt$ = Lot_GetFirst("", F_SHARE+F_INOROUT) 
  1546.    WHILE (CurrChpt$ <> "")
  1547.       SharedID$ = Lot_GetChapterValStr(CurrChpt$, F_SHARE)   
  1548.       IF SharedID$="IVCPROGRAM" OR _
  1549.      SharedID$="CONTAINERFILEPROGRAM" OR _
  1550.      SharedID$="DATALENSPROGRAM" OR _
  1551.      SharedID$="DATALENSDATA" OR _
  1552.      SharedID$="DIALOGEDITORPROGRAM" OR _
  1553.      SharedID$="DESKTOP" OR _
  1554.      SharedID$="DOCUMENTFILEFILTERSPROGRAM" OR _
  1555.      SharedID$="DOCUMENTFILEFILTERSFILTER" OR _
  1556.      SharedID$="GRAMMARCHECKERPROGRAM" OR _
  1557.      SharedID$="GRAMMARCHECKERDATA" OR _
  1558.      SharedID$="GRAPHICFILEFILTERSPROGRAM" OR _
  1559.      SharedID$="HYPHENATIONPROGRAM" OR _
  1560.      SharedID$="HYPHENATIONDATA" OR _
  1561.      SharedID$="ICONPALETTEPROGRAM" OR _
  1562.      SharedID$="INFOBOXPROGRAM" OR _
  1563.      SharedID$="SCRIPTPROGRAM" OR _
  1564.      SharedID$="MULTIMEDIAPROGRAM" OR _
  1565.      SharedID$="MULTIMEDIADATA" OR _
  1566.      SharedID$="SPELLCHECKERPROGRAM" OR _
  1567.      SharedID$="SPELLCHECKERDATA" OR _
  1568.      SharedID$="SPELLCHECKERUSER" OR _
  1569.      SharedID$="STATUSBARPROGRAM" OR _
  1570.      SharedID$="THESAURUSPROGRAM" OR _
  1571.      SharedID$="THESAURUSDATA" OR _
  1572.      SharedID$="TOOLSPROGRAM" OR _
  1573.      SharedID$="TOOLSDATA" OR _
  1574.      SharedID$="USERNAMESERVICESPROGRAM" OR _
  1575.      SharedID$="FILTERS" OR _
  1576.      SharedID$="EXCELFLT" THEN
  1577.      
  1578.         ShareSize& = ShareSize&+Lot_GetInfChapterSize(CurrChpt$)
  1579.  
  1580.       END IF
  1581.  
  1582.       CurrChpt$ = Lot_GetNext() 
  1583.  
  1584.    WEND
  1585.  
  1586.    Lot_GetSharedToolsSize = INT(ShareSize&/1024)
  1587.  
  1588. 'testint% = INT(ShareSize& / 1024)
  1589. 'Lot_GetSharedToolsSize = testint%
  1590. 'DoMsgBox("testint%", STR$(testint%), MB_OK)
  1591.  
  1592. END FUNCTION
  1593.  
  1594.  
  1595. PUBLIC FUNCTION Lot_GetShared32ToolsSize() AS INTEGER
  1596. '** Purpose:
  1597. '**     Gets the size of the shared tools for Win32 in Kb
  1598. '** Arguments:
  1599. '** Returns:
  1600. '**     the size or 0
  1601. '*************************************************************************
  1602.    DIM CurrChpt$, SharedID$, ShareSize&
  1603.  
  1604.    CurrChpt$ = Lot_GetFirst("", F_SHARE+F_INOROUT) 
  1605.    WHILE (CurrChpt$ <> "")
  1606.       SharedID$ = Lot_GetChapterValStr(CurrChpt$, F_SHARE)   
  1607.       IF SharedID$="WIN32IVCPROGRAM" OR _
  1608.      SharedID$="WIN32CONTAINERFILEPROGRAM" OR _
  1609.      SharedID$="WIN32DATALENSPROGRAM" OR _
  1610.      SharedID$="WIN32DATALENSDATA" OR _
  1611.      SharedID$="WIN32DIALOGEDITORPROGRAM" OR _
  1612.      SharedID$="WIN32DESKTOP" OR _
  1613.      SharedID$="WIN32DOCUMENTFILEFILTERSPROGRAM" OR _
  1614.      SharedID$="WIN32DOCUMENTFILEFILTERSFILTER" OR _
  1615.      SharedID$="WIN32GRAMMARCHECKERPROGRAM" OR _
  1616.      SharedID$="WIN32GRAMMARCHECKERDATA" OR _
  1617.      SharedID$="WIN32GRAPHICFILEFILTERSPROGRAM" OR _
  1618.      SharedID$="WIN32HYPHENATIONPROGRAM" OR _
  1619.      SharedID$="WIN32HYPHENATIONDATA" OR _
  1620.      SharedID$="WIN32ICONPALETTEPROGRAM" OR _
  1621.      SharedID$="WIN32INFOBOXPROGRAM" OR _
  1622.      SharedID$="WIN32SCRIPTPROGRAM" OR _
  1623.      SharedID$="WIN32MULTIMEDIAPROGRAM" OR _
  1624.      SharedID$="WIN32MULTIMEDIADATA" OR _
  1625.      SharedID$="WIN32SPELLCHECKERPROGRAM" OR _
  1626.      SharedID$="WIN32SPELLCHECKERDATA" OR _
  1627.      SharedID$="WIN32SPELLCHECKERUSER" OR _
  1628.      SharedID$="WIN32STATUSBARPROGRAM" OR _
  1629.      SharedID$="WIN32THESAURUSPROGRAM" OR _
  1630.      SharedID$="WIN32THESAURUSDATA" OR _
  1631.      SharedID$="WIN32TOOLSPROGRAM" OR _
  1632.      SharedID$="WIN32TOOLSDATA" OR _
  1633.      SharedID$="WIN32USERNAMESERVICESPROGRAM" OR _
  1634.      SharedID$="WIN32FILTERS" OR _
  1635.      SharedID$="WIN32EXCELFLT" THEN
  1636.      
  1637.         ShareSize& = ShareSize&+Lot_GetInfChapterSize(CurrChpt$)
  1638.  
  1639.       END IF
  1640.  
  1641.       CurrChpt$ = Lot_GetNext() 
  1642.  
  1643.    WEND
  1644.  
  1645.    Lot_GetShared32ToolsSize = INT(ShareSize&/1024)
  1646.  
  1647. 'testint% = INT(ShareSize& / 1024)
  1648. 'Lot_GetSharedToolsSize = testint%
  1649. 'DoMsgBox("testint%", STR$(testint%), MB_OK)
  1650.  
  1651. END FUNCTION
  1652.  
  1653.  
  1654. '*********************************************************
  1655.  
  1656. PUBLIC FUNCTION GetAbsPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  1657. '** Purpose: This function is called whenever we need to retrieve a string
  1658. '**           from .ini file. Function returns a clean path (path returned from
  1659. '**           FCleanFatPath.    
  1660. '** Author:    JKK
  1661. '** Arguments:  Name of the .ini file, section name in the .ini file, key we
  1662. '**             are searching for and two integer flags, nullflag% & invalidpath%.
  1663. '**             Function puts up two error messages based on the value of nullflag%, and 
  1664. '**             invalidpath. 
  1665. '** Returns:   Function either returns null or the value of the string.
  1666. '**     
  1667. '*************************************************************************
  1668.   DIM rstring$, rv%, errText$
  1669.  
  1670.    GetAbsPathFromIni = ""
  1671.    rstring$ = GetIniKeyString(szFile$, szSect$, szKey$)
  1672.    If rstring$ <> "" Then
  1673.  
  1674.       rv% = Lot_CleanPath(rstring$)
  1675.  
  1676.       'tqi - I believe this trim should no longer be necessary, but no harm to leave it 
  1677.       errText$ =  NullTrim(szFile$)
  1678.       if rv% <> 0 Then
  1679.      GetAbsPathFromIni = rstring$
  1680.       elseif invalidpathflag% <> FALSE then
  1681.  
  1682.      ErrorMsg SID_ERR_GETINIKEYSTRING, errText$
  1683.      ERROR STFQUIT
  1684.  
  1685.       end if 
  1686.  
  1687.    elseif nullflag% <> FALSE then
  1688.  
  1689.       ErrorMsg SID_ERR_GETINIKEYSTRING, errText$
  1690.       ERROR STFQUIT
  1691.  
  1692.    else
  1693.       GetAbsPathFromIni = ""
  1694.    end if
  1695.  
  1696. END FUNCTION
  1697.  
  1698. PUBLIC FUNCTION MakePath (szDir$, szFile$) AS STRING
  1699. '** Purpose:
  1700. '**     Appends a file name to the end of a directory path,
  1701. '**     inserting a backslash character as needed.
  1702. '** Arguments:
  1703. '**     szDir$  - full directory path (with optional ending "\")
  1704. '**     szFile$ - filename to append to directory
  1705. '** Returns:
  1706. '**     Resulting fully qualified path name. (Lower Case)
  1707. '*************************************************************************
  1708.    DIM sz$
  1709.  
  1710.    IF szDir$ = "" THEN
  1711.       sz$ = szFile$
  1712.    ELSEIF szFile$ = "" THEN
  1713.       sz$ = szDir$
  1714.    ELSEIF LENBP(szFile$) > 12 THEN
  1715.       IF LENBP(szFile$) = 13 AND RIGHT$(szFile$,1) = "\" THEN
  1716.       sz$ = szDir$ + szFile$
  1717.       ELSE      
  1718. '       sz$ = ""
  1719.             sz$ = szDir$ + "\" + szFile$
  1720.       END IF
  1721.    ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  1722.       sz$ = szDir$ + szFile$
  1723.    ELSE
  1724.       sz$ = szDir$ + "\" + szFile$
  1725.    END IF
  1726.  
  1727.    IF sz$ <> "" THEN
  1728.       MakePath = LCASE$(sz$)
  1729.    ELSE
  1730.       MakePath = sz$
  1731.    END IF
  1732.  
  1733.     
  1734.  
  1735. END FUNCTION
  1736.  
  1737. PUBLIC FUNCTION Lot_MakeSizeString(size&) AS STRING
  1738. '** Purpose:
  1739. '** Author:
  1740. '** Arguments:
  1741. '** Returns:
  1742. '**     
  1743. '*************************************************************************
  1744.    Lot_MakeSizeString = STR$(size&) + gStrK$
  1745. END FUNCTION
  1746. '*************************************************************************
  1747.  
  1748. PUBLIC FUNCTION Lot_ExtractDriveLetter(destdir$) AS STRING
  1749. '** Purpose:
  1750. '** Author:
  1751. '** Arguments:
  1752. '** Returns:
  1753. '**     
  1754. '*************************************************************************
  1755.   Lot_ExtractDriveLetter = LCASE$(MID$(destdir$, 1, 1))
  1756. END FUNCTION
  1757. '*************************************************************************
  1758.  
  1759. PUBLIC FUNCTION Lot_ExtractDirectory(destdir$) AS STRING
  1760. '** Purpose:
  1761. '** Author:
  1762. '** Arguments:
  1763. '** Returns:
  1764. '**     
  1765. '*************************************************************************
  1766.   Lot_ExtractDirectory = LCASE$(MID$(destdir$, 3))
  1767. END FUNCTION
  1768. '*************************************************************************
  1769. PUBLIC SUB      Lot_CallWinhelp32 (prodno%, network$, SectionName$, DestDirSym$, FileName$) 
  1770. '** Purpose:Calls winhelp32 to build GIDs at reinstall.
  1771. '** Author:MZ
  1772. '** Arguments:prodno%, 
  1773. '                    network$, 
  1774. '                    SectionName$, 
  1775. '                    DestDirSym$, 
  1776. '                    FileName$
  1777. '*************************************************************************
  1778. DIM ExecError%,CopyDestDir$
  1779.    IF GetListItem(SYM_INSTALLKINDS$, prodno%) = gREINSTALL$ THEN
  1780.         IF network$ = gSTANDARD$ OR network$ = gNODE$ THEN
  1781.            IF (Lot_IsTheFeatureInstalled(SectionName$) = 1) THEN
  1782.               'CopyDestDir$ = GetSymbolValue(DestDirSym$)
  1783.               CopyDestDir$ = Lot_WhereIsFeature(prodno%, SectionName$, FileName$)
  1784.          '     ExecError% = WinExec ("winhlp32 -g "+CopyDestDir$+FileName$, SW_HIDE)
  1785.               ExecError% = WinExec ("winhlp32 -g "+CopyDestDir$+FileName$, SW_SHOW)
  1786.            END IF
  1787.         END IF
  1788.    END IF
  1789. END SUB
  1790.  
  1791.  
  1792. '** UNC stuff
  1793.  
  1794.  
  1795. PUBLIC SUB Lot_SplitUNCPath (szFullPath$, szVol$, szDirPath$)
  1796. '** Purpose:Splits a string into a UNC volume and a directory path
  1797. '** Author:GJL
  1798. '** Arguments:A path string, a string for the UNC vol
  1799. '**             a string for the resulting dir path
  1800. '** Returns:If UNC vol is invalid szVol will be empty
  1801. '**     
  1802. '*************************************************************************
  1803.    DIM StrOff&, tmp&
  1804.  
  1805.    StrOff& = INSTR( szFullPath$, "\\" )
  1806.    IF StrOff = 1 THEN
  1807.       StrOff& = INSTR( MID$(szFullPath$, 3), "\" )
  1808.       IF StrOff > 0 THEN
  1809.     tmp& = StrOff + 3
  1810.     StrOff& = StrOff + 3
  1811.     StrOff& = INSTR( MID$(szFullPath$, tmp&), "\" ) - 1
  1812.     IF StrOff& > 0 THEN
  1813.        StrOff& = StrOff& + tmp&
  1814.        szVol$ = LEFT$(szFullPath$, StrOff& - 1)
  1815.        szDirPath$ = MID$(szFullPath$, StrOff)
  1816.     ELSE
  1817.        szVol$ = szFullPath$
  1818.        szDirPath = ""
  1819.     END IF
  1820.       ELSE 
  1821.     szVol$ = ""
  1822.     szDirPath = ""
  1823.       END IF
  1824.    ELSE
  1825.    szVol$ = ""
  1826.    szDirPath$ = szFullPath$       
  1827.    END IF
  1828. END SUB
  1829. '** end UNC stuff
  1830.  
  1831. PUBLIC SUB Lot_SplitAnyPath (szFullPath$, szVol$, szDirPath$)
  1832. '** Purpose:Splits a string into a volume and a directory path
  1833. '** Author:
  1834. '** Arguments:A path string, a string for the vol
  1835. '**             a string for the resulting dir path
  1836. '** Returns: Volume and directory
  1837. '**     
  1838. '*************************************************************************
  1839.  
  1840.     If Lot_IsUnvalidatedUNCPath(szFullPath$) Then
  1841.         Lot_SplitUNCPath szFullPath$, szVol$, szDirPath$
  1842.     Else
  1843.         szVol$ = LEFT$(szFullPath$, 2)
  1844.         szDirPath$ = MID$(szFullPath$,3)
  1845.     End If
  1846. END SUB
  1847.  
  1848. '***********************************************************************
  1849. PUBLIC FUNCTION Lot_GetVol (szFullPath$)
  1850. '**  Description:  
  1851. '**      Return the volume whether it is UNC or local.
  1852. '**    
  1853. '**  Explicit Parameters:
  1854. '**       szFullPath$        The path from which to extract the path.
  1855. '**
  1856. '**  Implicit Parameters:
  1857. '**  Returns:  The volume.
  1858. '***********************************************************************
  1859.  
  1860.  
  1861.     DIM szVol$, szDirPath$
  1862.  
  1863.     Lot_SplitAnyPath szFullPath$, szVol$, szDirPath$
  1864.  
  1865.     Lot_GetVol = szVol$
  1866. END FUNCTION
  1867.  
  1868. '***********************************************************************
  1869. '**
  1870. '**  Name: ShowPathError
  1871. '**  Description:  
  1872. '**      Display a path error
  1873. '**    
  1874. '**  Explicit Parameters:
  1875. '**   nmsg&          The error message number to display. Use 0 if none
  1876. '**   nDescription%  The description of the message
  1877. '**   szPath$        The path with the problem
  1878. '**
  1879. '**  Out symbols:
  1880. '**    
  1881. '**  Implicit Parameters:
  1882. '**    
  1883. '***********************************************************************
  1884.  
  1885. PUBLIC SUB ShowPathError (nmsg%, nDescription%, szPath$)
  1886.    DIM sz$
  1887.  
  1888.    sz$ = CHR$(10) + CHR$(10) + "     " + szPath$
  1889.    sz$ = NullTrim$(sz$)
  1890.    IF nDescription% <> 0 THEN
  1891.       sz$ = sz$ + CHR$(10) + CHR$(10) + LdString(nDescription%)
  1892.    END IF
  1893.    ErrorMsg nmsg%, sz$
  1894.  
  1895. END SUB
  1896.  
  1897. '***********************************************************************
  1898. '**
  1899. '**  Name: ShowPathErrorNoDlgExit
  1900. '**  Description:  
  1901. '**      Display a path error and tell the dialog not to exit
  1902. '**    
  1903. '**  Explicit Parameters:
  1904. '**   nmsg&          The error message number to display. Use 0 if none
  1905. '**   nDescription&  The description of the message
  1906. '**   szPath$        The path with the problem
  1907. '**
  1908. '**  Out symbols:
  1909. '**   __LASTSTATUS   Set to "Q" to tell script not to quit   
  1910. '**    
  1911. '**  Implicit Parameters:
  1912. '**    
  1913. '***********************************************************************
  1914.  
  1915. PUBLIC SUB ShowPathErrorNoDlgExit (nmsg%, nDescription%, szPath$)
  1916.  
  1917.    ShowPathError nmsg%, nDescription%, szPath$
  1918.    SetListItem "__LASTSTATUS", 1, "Q"
  1919.  
  1920. END SUB
  1921.  
  1922. '***********************************************************************
  1923. '**
  1924. '**  Name: IsPathWritable
  1925. '**  Description:  
  1926. '**      Determine if we can write to a path.
  1927. '**    
  1928. '**  Explicit Parameters:
  1929. '**      szPath$     Pathname with no filename.
  1930. '**
  1931. '**  Out symbols:
  1932. '**    
  1933. '**  Implicit Parameters:
  1934. '**
  1935. '**  Returns: 1 if path is writable
  1936. '**    
  1937. '***********************************************************************
  1938.  
  1939.  
  1940. PUBLIC FUNCTION IsPathWritable (szPath$) AS INTEGER
  1941.  
  1942.    DIM sz$, cb%, i%, j%, uncVol& ,szUNC$, szDir$, szDrv$
  1943.  
  1944.    '** We can't check if the path is writable if the syntax is bad
  1945.     szDrv$ = CreateBuffer(10)
  1946.    IsPathWritable = 0
  1947.    uncVol& = 0
  1948.  
  1949.    Lot_SplitUNCPath szPath$, szUNC$, szDir$
  1950.    IF szUNC$ = "" THEN
  1951.     sz$ = szPath$
  1952.    ELSE
  1953.     uncVol& = FMapUNCVolume( szUNC$, szDrv$ )
  1954.     IF uncVol& = FALSE THEN
  1955.       IsPathWritable = FALSE
  1956.       EXIT FUNCTION
  1957.     END IF
  1958.     sz$ = NullTrim(szDrv$) + szDir$
  1959.    END IF
  1960.  
  1961.    IF Lot_CheckPath(szPath$) <> FALSE THEN
  1962.       '** Strip any trailing backslash
  1963.       IF cb% > 3 AND RIGHT$(sz$,1) = "\" THEN
  1964.      cb% = LEN(sz$)
  1965.      sz$ = MID$(sz$,1,(cb%-1))
  1966.       END IF
  1967.  
  1968.       '** Back through the directories until we find a directory that exists
  1969.       DO
  1970.      '** If the directory exists then return if the directory is writable
  1971.      IF LEN(sz$) <= 3 OR DoesDirExist(sz$) = 1 THEN
  1972.         IsPathWritable = IsDirWritable(sz$)
  1973.         IF IsPathWritable = FALSE THEN
  1974.               SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  1975.             END IF
  1976.         EXIT DO
  1977.      END IF
  1978.  
  1979.      '** If dir does not exists then strip off the last dir and try again
  1980.      i% = INSTR(sz$,"\")
  1981.      IF i% = 0 THEN EXIT DO
  1982.      DO
  1983.         j% = INSTR((i%+1),sz$,"\")
  1984.         IF j% = 0 THEN
  1985.            IF i% = 3 THEN
  1986.           sz$ = MID$(sz$,1,3)        '** Handle root special
  1987.            ELSE
  1988.           sz$ = MID$(sz$,1,(i%-1))   '** Strip last directory
  1989.            END IF
  1990.            EXIT DO
  1991.         END IF
  1992.         i% = j%
  1993.      LOOP
  1994.       LOOP
  1995.    END IF
  1996.    IF uncVol& > 0 THEN
  1997.       uncVol& = FUnmapUNCVolume( szDrv$ )
  1998.    END IF
  1999. END FUNCTION
  2000.  
  2001. '***********************************************************************
  2002. '**
  2003. '**  Name: ValidatePath
  2004. '**  Description:  
  2005. '**      Determine if path is valid and display errors
  2006. '**
  2007. '**      THIS FUNCTION SHOULD ONLY BE USED FOR DESTINATION PATHS!!!
  2008. '**    
  2009. '**  Explicit Parameters:
  2010. '**      szPath$     Pathname with no filename
  2011. '**
  2012. '**  Out symbols:
  2013. '**    
  2014. '**  Implicit Parameters:
  2015. '**
  2016. '**  Returns: 1 if path is valid
  2017. '**    
  2018. '***********************************************************************
  2019.  
  2020. PUBLIC FUNCTION ValidatePath (szPath$) AS INTEGER
  2021.  
  2022.    DIM cch%, difflen% , notused&
  2023.    DIM volPath$, dirPath$, writable%, dirPathType$
  2024.  
  2025.    ValidatePath = FALSE
  2026.    if szPath$ = "" then 
  2027.       Exit Function
  2028.    End if
  2029.    cch% = LENBP(szPath$)
  2030.    difflen% = cch% + CINT(GetSymbolValue(SYM_DOSMAXPATHDIFF$))
  2031.    SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_ERR_DIRSYNTAXDESCRLONG)
  2032. '*** UNC stuff
  2033.    '** If it's a UNC path do some checks
  2034.  
  2035.    IF Lot_CleanPath(szPath$) = FALSE THEN
  2036.      ShowPathError SID_ERR_DIRSYNTAX,_
  2037.             CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2038.      szPath$ = NullTrim$(szPath$)
  2039.      EXIT FUNCTION
  2040.    END IF
  2041.    
  2042.    IF Lot_IsUnvalidatedUNCPath(szPath$) = TRUE THEN
  2043.  
  2044.      Lot_SplitUNCPath szPath$, volPath$, dirPath$
  2045.  
  2046.      IF Lot_IsvalidUNCPath(volPath$) = FALSE THEN
  2047.        ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, volPath$
  2048.  
  2049.      ELSEIF dirPath$ = "" OR Len(dirPath$) = 1 THEN
  2050.        ShowPathError SID_ERR_DIRSYNTAX, SID_ERR_DIRROOTDESCR, szPath$
  2051.  
  2052. '     ELSEIF Lot_CleanPath(szPath$) = FALSE THEN
  2053. '     ShowPathError SID_ERR_DIRSYNTAX,_
  2054. '            CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2055.  
  2056. '** Make sure the path is not too long
  2057.      ELSEIF difflen% > MAX_DIR_PATH THEN
  2058.     '** This is only about the path length and might need a new message
  2059.        ShowPathError SID_ERR_PATHLEN, SID_ERR_PATHLEN_DESCR, _
  2060.             STR$(MAX_DIR_PATH - CINT(GetSymbolValue(SYM_DOSMAXPATHDIFF$)))+LdString(SID_ERR_PATHLEN_CHARS)
  2061.  
  2062.      ELSE
  2063.        SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  2064.        writable% = IsPathWritable(szPath$)
  2065.        IF writable% = FALSE THEN
  2066.      ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, szPath$
  2067.          ValidatePAth = FALSE
  2068.        ELSE
  2069.          ValidatePath = TRUE 
  2070.        END IF
  2071.      END IF
  2072. '*** end UNC stuff
  2073.    ELSE
  2074. '*** Check letter drives
  2075.       '** Make sure the drive is valid
  2076.       IF (MID$(szPath$,2,1) = ":" AND IsDriveValid(szPath$) = FALSE) THEN
  2077.     ShowPathError SID_DRV_NOTEXIST, 0, MID$(szPath$,1,2)
  2078.  
  2079.       '** Make sure the syntax of the path name is correct
  2080. '      ELSEIF Lot_CleanPath(szPath$) = FALSE THEN
  2081. '      ShowPathError SID_ERR_DIRSYNTAX,_
  2082. '             CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2083.       '** Make sure not installing to the root
  2084.       ELSEIF (LEN(szPath$) = 2) OR (LEN(szPath$) = 3 _
  2085.          AND MID$(szPath$,3,1) = "\") THEN
  2086.     ShowPathError SID_ERR_DIRSYNTAX, SID_ERR_DIRROOTDESCR, szPath$
  2087.  
  2088.      '** Make sure the path is not too long
  2089.       ELSEIF difflen% > MAX_DIR_PATH THEN
  2090.     '** This is only about the path length and might need a new message
  2091.     ShowPathError SID_ERR_PATHLEN, SID_ERR_PATHLEN_DESCR, _
  2092.             STR$(MAX_DIR_PATH - CINT(GetSymbolValue(SYM_DOSMAXPATHDIFF$)))+LdString(SID_ERR_PATHLEN_CHARS)
  2093.       ELSE
  2094.     '** Make sure the path is writable
  2095.  
  2096.     writable% = IsPathWritable(szPath$)
  2097.     IF writable% = FALSE THEN
  2098.           SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  2099.       ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, szPath$
  2100.       ValidatePAth = FALSE
  2101.     ELSE
  2102.       ValidatePath = TRUE
  2103.     END IF
  2104.        END IF
  2105.    END IF
  2106.    szPath$ = NullTrim$(szPath$)
  2107. END FUNCTION
  2108.  
  2109. 'PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  2110. '** Purpose:check editbox text for valid volumes 
  2111. '** Author:
  2112. '** Arguments:
  2113. '** Returns:
  2114. '**     
  2115. '*************************************************************************
  2116. PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  2117.    DIM  eb$, vol$, path$, editbox$, combobox$, comboId%
  2118.  
  2119.    comboBox = "IDC_COMBO"+Right$(Str$(Ctrl%),1)
  2120.    editBox = "IDC_EDIT"+Right$(Str$(Ctrl%),1)
  2121.    comboId% = Ctrl% + 400
  2122. '**CB_GETCURSEL = 0x147 = 327
  2123.    ValidateEditBox = 1 + SendMessage(GetDlgItem(hDlg&,comboId%), 327, 0, 0)
  2124.    eb$=GetListItem("IDC_EDIT",Ctrl%)
  2125.    Lot_SplitUNCPath eb$, vol$, path$
  2126.    IF NOT vol$ = "" THEN
  2127. '** There is a UNC path in the edit box
  2128.       IF ValidatePath(eb$) = FALSE THEN
  2129.         ValidateEditBox = FALSE
  2130.         EXIT FUNCTION
  2131.       END IF
  2132.       ValidateEditBox = SelectDriveCombo(combobox, vol$)
  2133.       IF ValidateEditBox = 0 THEN
  2134.         ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, vol$
  2135.       END IF
  2136.       EXIT FUNCTION
  2137.    ELSE
  2138.       IF MID$(eb$,2,1) = ":" THEN
  2139. '** There is a drive letter in the edit box
  2140.      ValidateEditBox = SelectDriveCombo (comboBox, eb$)
  2141.      IF ValidateEditBox = 0 THEN
  2142.         ShowPathError SID_DRV_NOTEXIST, 0, Left$(eb$,2)
  2143.      ELSE
  2144.         SetListItem "IDC_EDIT", Ctrl%, Lot_ExtractDirectory(eb$)
  2145.         AddListItem SYM_UPDATELIST$, editBox
  2146.      END IF
  2147.       ELSE 
  2148.      IF MID$(eb$,1,1) <> "\" THEN
  2149.         SetListItem "IDC_EDIT", Ctrl%, "\"+eb$
  2150.         AddListItem SYM_UPDATELIST$, editBox
  2151.       
  2152.      END IF
  2153.       END IF
  2154.    END IF
  2155. END FUNCTION
  2156.  
  2157. 'PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  2158. '** Purpose:check browse results text for valid volumes 
  2159. '** Author:
  2160. '** Arguments:
  2161. '** Returns:
  2162. '**     
  2163. '*************************************************************************
  2164. PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  2165.    DIM  eb$, vol$, path$, editbox$, combobox$, comboId%
  2166.  
  2167.    comboBox = "IDC_COMBO"+Right$(Str$(Ctrl%),1)
  2168.    editBox = "IDC_EDIT"+Right$(Str$(Ctrl%),1)
  2169.    comboId% = Ctrl% + 400
  2170. '**CB_GETCURSEL = 0x147 = 327
  2171.    ValidateBrowse = 1 + SendMessage(GetDlgItem(hDlg&,comboId%), 327, 0, 0)
  2172.    eb$=GetSymbolValue("SYM_BROWSE_RESULT")
  2173.    Lot_SplitUNCPath eb$, vol$, path$
  2174.    IF NOT vol$ = "" THEN
  2175.       IF ValidatePath(eb$) = FALSE THEN
  2176.         ValidateBrowse = FALSE
  2177.         EXIT FUNCTION
  2178.       END IF
  2179.       ValidateBrowse = SelectDriveCombo(combobox, vol$)
  2180.       IF ValidateBrowse = 0 THEN
  2181.         ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, vol$
  2182.       ELSE
  2183.     SetListItem "IDC_EDIT", Ctrl%, eb$
  2184.     AddListItem SYM_UPDATELIST$, editBox
  2185.       END IF
  2186.       EXIT FUNCTION
  2187.    ELSE
  2188.       IF MID$(eb$,2,1) = ":" THEN
  2189.      ValidateBrowse = SelectDriveCombo (comboBox, eb$)
  2190.      IF ValidateBrowse = 0 THEN
  2191.         ShowPathError SID_DRV_NOTEXIST, 0, Left$(eb$,2)
  2192.      ELSE
  2193.         SetListItem "IDC_EDIT", Ctrl%, Lot_ExtractDirectory(eb$)
  2194.         AddListItem SYM_UPDATELIST$, editBox
  2195.      END IF
  2196.       ELSE 
  2197.      IF MID$(eb$,1,1) <> "\" THEN
  2198.         SetListItem "IDC_EDIT", Ctrl%, "\"+eb$
  2199.         AddListItem SYM_UPDATELIST$, editBox
  2200.       
  2201.      END IF
  2202.       END IF
  2203.    END IF
  2204. END FUNCTION
  2205.  
  2206.  
  2207.  
  2208.  
  2209. PUBLIC FUNCTION Lot_Dir  (szDir$) AS STRING
  2210. '** Purpose:
  2211. '** Author:
  2212. '** Arguments:
  2213. '** Returns:
  2214. '**     
  2215. '*************************************************************************
  2216.     DIM DirRet$
  2217.  
  2218.     DirRet$ = Dir$(szDir$)
  2219.     Lot_Dir = DirRet$
  2220. END FUNCTION
  2221.  
  2222. PUBLIC FUNCTION Lot_GetLocalHardDrive(ProdSize&,DefaultDir$) AS STRING
  2223. '** Purpose:
  2224. '**     Gets the first writable local hard disk with enough space e.g. D:
  2225. '** Arguments:
  2226. '**     ProdSize& the minimum size requirements for installing a product
  2227. '**     DefaultDir$  the default directory to install to
  2228. '** Returns:
  2229. '**     D:\ + DefaultDir$ or an empty string
  2230. '*************************************************************************
  2231.    DIM Length%, count%, lDrive$, SpaceAvail&
  2232.  
  2233.    Lot_GetLocalHardDrive = ""
  2234.    Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  2235.     IF Length% = 0 THEN
  2236.        GetLocalHardDrivesList SYM_LOCALHARDDRIVES$
  2237.        Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  2238.     END IF
  2239.    FOR count% = 1 TO Length%
  2240.       lDrive$     = GetListItem(SYM_LOCALHARDDRIVES$, count%)
  2241.       SpaceAvail& = GetFreeSpaceForDrive(lDrive$)
  2242.       lDrive$     = lDrive$ + ":\" + DefaultDir$
  2243.       IF SpaceAvail& > (ProdSize& \ 1024) AND IsDirWritable(lDrive$) THEN
  2244.      Lot_GetLocalHardDrive = LCASE$(lDrive$)
  2245.      EXIT FUNCTION
  2246.       END IF
  2247.    NEXT
  2248.  
  2249. END FUNCTION
  2250.  
  2251. PUBLIC FUNCTION Lot_GetNetHardDrive(ProdSize&,DefaultDir$) AS STRING
  2252. '** Purpose:
  2253. '**     Gets the first writable network hard disk with enough space e.g. D:
  2254. '** Arguments:
  2255. '**     ProdSize& the minimum size requirements for installing a product
  2256. '**     DefaultDir$  the default directory to install to
  2257. '** Returns:
  2258. '**     D:\ + DefaultDir$ or an empty string
  2259. '*************************************************************************
  2260.    DIM Length%, count%, lDrive$, SpaceAvail&
  2261.  
  2262.    Lot_GetNetHardDrive = ""
  2263.    GetNetworkDrivesList SYM_NETHARDDRIVES$
  2264.    Length% = GetListLength(SYM_NETHARDDRIVES$)
  2265.    FOR count% = 1 TO Length%
  2266.       lDrive$     = GetListItem(SYM_NETHARDDRIVES$, count%)
  2267.       SpaceAvail& = GetFreeSpaceForDrive(lDrive$)
  2268.       lDrive$     = lDrive$ + ":\" + DefaultDir$
  2269.       IF SpaceAvail& > (ProdSize& \ 1024) AND IsDirWritable(lDrive$) THEN
  2270.      Lot_GetNetHardDrive = LCASE$(lDrive$)
  2271.      EXIT FUNCTION
  2272.       END IF
  2273.    NEXT
  2274.  
  2275. END FUNCTION
  2276.  
  2277. PUBLIC FUNCTION Lot_GetAllHardDrive(ProdSize&,DefaultDir$) AS STRING
  2278. '** Purpose:
  2279. '**     Gets the first writable local or network hard disk with enough 
  2280. '**     space e.g. D:
  2281. '** Arguments:
  2282. '**     ProdSize& the minimum size requirements for installing a product
  2283. '**     DefaultDir$  the default directory to install to
  2284. '** Returns:
  2285. '**     D:\ + DefaultDir$ or an empty string
  2286. '*************************************************************************
  2287.  
  2288.    DIM   drv$
  2289.  
  2290.    drv$ = Lot_GetLocalHardDrive(ProdSize&, DefaultDir$)
  2291.    IF drv$ <> "" THEN
  2292.       Lot_GetAllHardDrive = drv$
  2293.    ELSE
  2294.       Lot_GetAllHardDrive = Lot_GetNetHardDrive(ProdSize&, DefaultDir$)
  2295.    END IF
  2296.  
  2297. END FUNCTION
  2298.  
  2299. PUBLIC FUNCTION Lot_GetChapterFromKeyword (szKeyword$) AS STRING
  2300. '** Purpose: Get the chapter # given the Chapter name
  2301. '** Author:
  2302. '** Arguments:
  2303. '** Returns:
  2304. '**     
  2305. '*************************************************************************
  2306.     DIM g_strbuf$
  2307.  
  2308.     g_strbuf$ = CreateBuffer(256)
  2309.     If FGetChapterFromKeyword(szKeyword$, g_strbuf$, 256) = 0 Then
  2310.        Lot_GetChapterFromKeyword = ""
  2311.     Else
  2312.        Lot_GetChapterFromKeyword = NullTrim(g_strbuf$)
  2313.     End If
  2314. END FUNCTION
  2315.  
  2316. PUBLIC Lot_CallExec_RC$ 
  2317.  
  2318. PUBLIC FUNCTION Lot_CallProductFunctions (func_name$, BYVAL direction$, always%, back$, parms$) AS STRING
  2319. '** Purpose:
  2320. '** Author:
  2321. '** Arguments:
  2322. '**     func_name$: Name of function + prod Acronym will be called.
  2323. '**     always%: IF TRUE then alwasy calls function, otherwise only if product is turned on.
  2324. '**     direction$: determines the direction: gBACK means start at the last callback.
  2325. '** Returns:
  2326. '**     
  2327. '*************************************************************************
  2328.   DIM n%, i%, lname$, prodcall$, notused%, incr%
  2329.  
  2330.   Lot_CallProductFunctions = ""
  2331.   n% = Reg_GetNumberOfProducts()
  2332.   If direction$ = gBACK Then
  2333.     i% = n%
  2334.     incr% = 1
  2335.   Else
  2336.     i% = 1
  2337.     incr% = -1
  2338.   End If
  2339.   WHILE (i%  >= 1 AND i% <= n%)
  2340.  
  2341.      lname$ = Reg_GetProductAcronym(i%)
  2342.      If lname$ <> "" AND (always% <> FALSE OR Prods(i%).UIInOrOut <> FALSE) Then
  2343.             '
  2344.             ' construct a lotus script statement for EXECUTE. It will look
  2345.             ' something like this:
  2346.             '     INIT123(i%, "server$", parms$)
  2347.             '
  2348.     If parms$ <> "" Then
  2349.        prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & i% & "," & |"| & GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| &  "," & parms$ & ")"
  2350.     Else
  2351.        prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & i% & "," & |"| &  GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & ")"
  2352.     End If
  2353.      ' DOEXEC removed and replaced by EXECUTE!
  2354.             ' call DOEXEC, which acts like the script EXECUTE statement.
  2355.             ' The difference is that DOEXEC operates in the default module,
  2356.             ' while  EXECUTE creates a temporary module that disappears once the
  2357.             ' call is made.  The first parameter to DOEXEC is a module name,
  2358.             ' which is made into a "USE modname" statement, if that module 
  2359.             ' name has not yet been USE'd via DOEXEC. The second arg is the
  2360.             ' statement to be run. Note - the args must be call by value,
  2361.             ' not reference (can be done by enclosing args in parens)       
  2362.  
  2363.           gEndStatementEncountered% = FALSE
  2364.     '** TV : old execute : on error doesn't work
  2365.     'EXECUTE(|USE "| & lname$ & |" : | & prodcall$)
  2366.     '** TV : new 
  2367.     EXECUTE(|USE "| & lname$ & |" : SUB INITIALIZE : | & prodcall$ & |:END SUB|)
  2368.  
  2369.           '  this gEndStatementEncountered flag is necessary because the Lotus
  2370.           '  END statement, which normally exists the entire program, only
  2371.     '  exits the top-level routine running in DOEXEC.  So,
  2372.           '  check this flag here, to see if we hit an END during DOEXEC.
  2373.  
  2374.           IF gEndStatementEncountered% = TRUE THEN
  2375.             END                                            ' exit the program
  2376.           END IF
  2377.  
  2378.     direction$ = Lot_CallExec_RC$
  2379.     If direction$ = gBACK Then
  2380.        incr% = -1
  2381.     Else
  2382.        incr% = 1
  2383.     End If
  2384.      End If
  2385.  
  2386.      If direction$ = gBACK AND back$ = gALLPRODUCTS then
  2387.        Lot_CallProductFunctions = direction$
  2388.        Exit Function
  2389.      End If
  2390.  
  2391.      i% = i% + incr%
  2392.   WEND
  2393.  
  2394.   Lot_CallProductFunctions = direction$
  2395.  
  2396. END FUNCTION
  2397.  
  2398. PUBLIC FUNCTION Lot_CallOneProductFunction (prodno%, func_name$, BYVAL direction$, always%, parms$) AS STRING
  2399. '** Purpose:
  2400. '** Author:
  2401. '** Arguments:
  2402. '** Returns:
  2403. '**     
  2404. '*************************************************************************
  2405.   DIM lname$, prodcall$, notused%
  2406.  
  2407.   Lot_CallOneProductFunction = ""
  2408.   lname$ = Reg_GetProductAcronym(prodno%)
  2409.   If lname$ <> "" Then
  2410.      '
  2411.      ' construct a lotus script statement for EXECUTE. It will look
  2412.      ' something like this:
  2413.      '     USE "123":INIT123(prodno%, "server$", parms$)
  2414.      '
  2415.      If parms$ <> "" Then
  2416.     prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & prodno% & "," & |"| & GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & "," & parms$ & ")"
  2417.      Else
  2418.     prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & prodno% & "," & |"| &  GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & ")"
  2419.      End If
  2420.  
  2421.      ' DOEXEC removed and replaced by EXECUTE!
  2422.             ' call DOEXEC, which acts like the script EXECUTE statement.
  2423.             ' The difference is that DOEXEC operates in the default module,
  2424.             ' while  EXECUTE creates a temporary module that disappears once the
  2425.             ' call is made.  The first parameter to DOEXEC is a module name,
  2426.             ' which is made into a "USE modname" statement, if that module 
  2427.             ' name has not yet been USE'd via DOEXEC. The second arg is the
  2428.             ' statement to be run. Note - the args must be call by value,
  2429.             ' not reference (can be done by enclosing args in parens)       
  2430.             
  2431.        gEndStatementEncountered% = FALSE            ' see Lot_CallProductFunctions
  2432.  
  2433.       '** TV : old execute : on error doesn't work
  2434.       'EXECUTE(|USE "| & lname$ & |" : | & prodcall$)
  2435.       '** TV : new 
  2436.       EXECUTE(|USE "| & lname$ & |" : SUB INITIALIZE : | & prodcall$ & |:END SUB|)
  2437.     
  2438.  
  2439.        IF gEndStatementEncountered% = TRUE THEN
  2440.             END                                            ' exit the program
  2441.        END IF
  2442.  
  2443.      Lot_CallOneProductFunction = Lot_CallExec_RC$
  2444.  
  2445.  
  2446.   End If
  2447.  
  2448.  
  2449. END FUNCTION
  2450.  
  2451. '*************************************************************************
  2452. PUBLIC FUNCTION Lot_CheckPath (path$) AS INTEGER
  2453. '** Purpose:
  2454. '** Author:
  2455. '** Arguments:
  2456. '** Returns:
  2457. '**     
  2458. '*************************************************************************
  2459.    DIM ldrive$, vol$, unused$
  2460.  
  2461.    Lot_CheckPath = FALSE
  2462.    path$ = NullTrim( path$ )
  2463.    IF path$ <> "" THEN
  2464.       Lot_SplitUNCPath path$, vol$, unused$
  2465.       IF vol$ = "" THEN
  2466.        ldrive$ = Lot_ExtractDriveLetter(path$)
  2467.  
  2468.        IF IsDriveValid(ldrive$) <> FALSE AND Lot_CleanPath(path$) <> FALSE THEN 
  2469.            Lot_CheckPath = TRUE
  2470.        END IF
  2471.       ELSE
  2472.        IF Lot_CleanPath(path$) <> FALSE THEN 
  2473.         Lot_CheckPath = TRUE
  2474.        END IF
  2475.       END IF
  2476.    END IF
  2477.  
  2478. END FUNCTION
  2479.  
  2480. PUBLIC FUNCTION Lot_GetFirst (szChapt$, nFlag%) AS STRING
  2481. '** Purpose:
  2482. '** Author:
  2483. '** Arguments:
  2484. '** Returns:
  2485. '**     
  2486. '*************************************************************************
  2487.   DIM g_strbuf$, Length%
  2488.  
  2489.   g_strbuf$ = CreateBuffer(256)
  2490.   if FGetFirst(szChapt$,g_strbuf$,CLng(nFlag%)) = 0 then
  2491.       Lot_GetFirst = ""     
  2492.   else
  2493.      Lot_GetFirst = NullTrim(g_strbuf)
  2494.  end if
  2495.  
  2496.  
  2497. END FUNCTION
  2498. '*************************************************************
  2499.  
  2500. PUBLIC FUNCTION Lot_GetNext () AS STRING
  2501. '** Purpose:
  2502. '** Author:
  2503. '** Arguments:
  2504. '** Returns:
  2505. '**     
  2506. '*************************************************************************
  2507.       DIM g_strbuf$
  2508.   
  2509.     g_strbuf$ = CreateBuffer(256)
  2510.     if FGetNext(g_strbuf$) = 0 then
  2511.        Lot_GetNext = ""         
  2512.     else
  2513.        Lot_GetNext = NullTrim(g_strbuf$)
  2514.      end if
  2515.  
  2516. END FUNCTION
  2517. '*************************************************************************
  2518.  
  2519. PUBLIC FUNCTION Lot_SetDateOfFile (szFile$, szDate$) AS INTEGER
  2520. '** Purpose:
  2521. '** Author:
  2522. '** Arguments:
  2523. '** Returns:
  2524. '**     
  2525. '*************************************************************************
  2526.   if FSetDateOfFile(szFile$,szDate$) = 0 then
  2527.     Lot_SetDateOfFile = 0   
  2528.   else
  2529.      Lot_SetDateOfFile = 1
  2530.   end if
  2531.  
  2532.  
  2533. END FUNCTION
  2534. '*************************************************************
  2535.  
  2536. PUBLIC SUB Lot_RemoveSectionFilesFromCopyList (szSect$) 
  2537. '** Purpose:
  2538. '** Author:
  2539. '** Arguments:
  2540. '** Returns:
  2541. '**     
  2542. '*************************************************************************
  2543. %rem
  2544.     if FValidInfSect(szSect$) = 0 then
  2545.     n% = 1
  2546.     else
  2547.     n% = 0
  2548.     end if
  2549.     if n% > 0 then
  2550.     BadArgErr n%, "Lot_RemoveSectionFilesFromCopyList", szSect$
  2551.     end if
  2552. %endrem ''DEBUG
  2553.  
  2554.     IF FRemoveSectionFilesFromCopyList (szSect$) = 0 THEN
  2555.     ErrorMsg SID_ERR_LOT_RSFFCL, ""
  2556.     ERROR STFQUIT
  2557.     END IF
  2558. END SUB
  2559. '*************************************************************************
  2560.  
  2561. PUBLIC SUB Lot_RemoveSectionKeyFileFromCopyList (szSect$, szKey$) 
  2562. '** Purpose:
  2563. '** Author:
  2564. '** Arguments:
  2565. '** Returns:
  2566. '**     
  2567. '*************************************************************************
  2568. %rem
  2569.     if FValidInfSect(szSect$) = 0 then
  2570.     n% = 1
  2571.     elseif szKey$ = "" then
  2572.     n% = 2
  2573.     else
  2574.     n% = 0
  2575.     end if
  2576.     if n% > 0 then
  2577.     BadArgErr n%, "Lot_RemoveSectionKeyFileFromCopyList", szSect$+", "+szKey$
  2578.     end if
  2579. %endrem ''DEBUG
  2580.  
  2581.     IF FRemoveSectionKeyFileFromCopyList (szSect$, szKey$) = 0 THEN
  2582.     ErrorMsg SID_ERR_LOT_RSKFFCL, ""
  2583.     ERROR STFQUIT
  2584.     END IF
  2585. END SUB
  2586. '*************************************************************************
  2587.  
  2588. PUBLIC FUNCTION Lot_GetInfSectionSize (szSect$)  AS LONG
  2589. '** Purpose:
  2590. '** Author:
  2591. '** Arguments:
  2592. '** Returns:
  2593. '**     
  2594. '*************************************************************************
  2595. %rem
  2596.     if FValidInfSect(szSect$) = 0 then
  2597.     n% = 1
  2598.     else
  2599.     n% = 0
  2600.     end if
  2601.     if n% > 0 then
  2602.     ERROR STFQUIT
  2603.     end if
  2604. %endrem
  2605.     Lot_GetInfSectionSize = LcbGetInfSectionSize(szSect$)
  2606. END FUNCTION
  2607.  
  2608. '** DND: These functions need an ASSERT!!!!!!!
  2609.  
  2610. PUBLIC FUNCTION Lot_AddPagetoNotebook (hDlg&,  Notebookid&,DlgId%, Tabstring$)   AS INTEGER
  2611. '** Purpose:
  2612. '** Author:
  2613. '** Arguments:
  2614. '** Returns:
  2615. '**     
  2616. '*************************************************************************
  2617.     DIM Dll$
  2618.     Dll$ = FindResourceinDLL (CLng(DlgId%), RT_DIALOG)
  2619.     If Dll$ = "" then
  2620.         Dll$ = "mscuistf.dll"
  2621.     End if
  2622.     Lot_AddPagetoNotebook = NotebookAddDlgPage(hDlg&,  Notebookid&,CLng(DlgId%), Dll$,FNAMEORGDLGPROC$,Tabstring$) 
  2623.     IF Lot_AddPagetoNotebook = 0 THEN
  2624.        ErrorMsg 0, "Error creating notebook page"
  2625.       ERROR STFQUIT
  2626.     END IF
  2627. END FUNCTION
  2628. '*************************************************************************
  2629.  
  2630. PUBLIC FUNCTION Lot_NotebookPageView (hDlg&,  Notebookid&, DlgId%, fShowPage%) AS INTEGER
  2631. '** Purpose:
  2632. '** Author:
  2633. '** Arguments:
  2634. '** Returns:
  2635. '**     
  2636. '*************************************************************************
  2637.    Lot_NotebookPageView = FNotebookPageView (hDlg&,  Notebookid&, CLng(DlgId%), CLng(fShowPage%))
  2638.    IF Lot_NotebookPageView = 0 THEN
  2639.       ErrorMsg 0, "Error viewing notebook page"
  2640.       ERROR STFQUIT
  2641.    END IF
  2642. END FUNCTION
  2643. '*************************************************************************
  2644.  
  2645. PUBLIC SUB Lot_TurnToPage (hDlg&,Notebookid&, pageid%) 
  2646. '** Purpose:
  2647. '** Author:
  2648. '** Arguments:
  2649. '** Returns:
  2650. '**     
  2651. '*************************************************************************
  2652.     IF  FNotebookTurnToPage(hDlg&,Notebookid&, CLng(pageid%)) <> 1 THEN
  2653.        ErrorMsg 0, "Error turning notebook page"
  2654.       ERROR STFQUIT
  2655.     END IF
  2656. END SUB
  2657. '*************************************************************************
  2658.  
  2659. PUBLIC FUNCTION Lot_GetPagehandle  (hDlg&,Notebookid&,Pageid%) AS LONG
  2660. '** Purpose:
  2661. '** Author:
  2662. '** Arguments:
  2663. '** Returns:
  2664. '**     
  2665. '*************************************************************************
  2666.     Lot_GetPagehandle = NotebookGetPageHwnd(hDlg&,Notebookid&,CLng(Pageid%)) 
  2667.     IF Lot_GetPagehandle = 0 THEN
  2668.        ErrorMsg 0, "Error getting the notebook page handle"
  2669.        ERROR STFQUIT
  2670.     END IF
  2671. END FUNCTION
  2672. '*************************************************************************
  2673.  
  2674. PUBLIC SUB Lot_LCBResetContent(hDlg&)
  2675. '** Purpose:
  2676. '** Author:
  2677. '** Arguments:
  2678. '** Returns:
  2679. '**     
  2680. '*************************************************************************
  2681.   LCBResetContent hDlg&
  2682. END SUB
  2683. '*************************************************************************
  2684.  
  2685. PUBLIC SUB Lot_LCBSetRedraw (hDlg&, fRedraw%)
  2686. '** Purpose:
  2687. '** Author:
  2688. '** Arguments:
  2689. '** Returns:
  2690. '**     
  2691. '*************************************************************************
  2692.   LCBSetRedraw hDlg&, CLng(fRedraw%)
  2693. END SUB
  2694. '*************************************************************************
  2695.  
  2696. PUBLIC FUNCTION Lot_LCBGetCount (hDlg&) AS INTEGER
  2697.  
  2698. '** Purpose:
  2699. '** Author:
  2700. '** Arguments:
  2701. '** Returns:
  2702. '**     
  2703. '*************************************************************************
  2704.  
  2705.    Lot_LCBGetCount = LCBGetCount(hDlg&)
  2706.  
  2707. END FUNCTION
  2708. '*************************************************************************
  2709.  
  2710. PUBLIC FUNCTION Lot_LCBAddItem (hDlg&, item$) AS INTEGER
  2711. '** Purpose:
  2712. '** Author:
  2713. '** Arguments:
  2714. '** Returns:
  2715. '**     
  2716. '*************************************************************************
  2717.      DIM rc%
  2718.  
  2719.    rc% = LCBAddItem (hDlg&, item$)
  2720.    If (rc% = 0) Then
  2721.       ErrorMsg 0, "Could not Add Item: "+item$+" to LCB on DLG: "+STR$(hDlg&)
  2722.       ERROR STFQUIT
  2723.    End If
  2724.    Lot_LCBAddItem= rc%
  2725.  
  2726. END FUNCTION
  2727. '*************************************************************************
  2728.  
  2729. PUBLIC FUNCTION Lot_LCBReplaceItem (hDlg&, index%, itemnum%, item$) AS INTEGER
  2730. '** Purpose:
  2731. '** Author:
  2732. '** Arguments:
  2733. '** Returns:
  2734. '**     
  2735. '*************************************************************************
  2736.    DIM rc%
  2737.  
  2738.    rc% = LCBReplaceItem (hDlg&, CLng(index%), CLng(itemnum%), item$)
  2739.    Lot_LCBReplaceItem = rc%
  2740.  
  2741. END FUNCTION
  2742. '*************************************************************************
  2743.  
  2744. PUBLIC FUNCTION Lot_LCBGetItem (hDlg&, index%, itemnum%) AS STRING
  2745. '** Purpose:
  2746. '** Author:
  2747. '** Arguments:
  2748. '** Returns:
  2749. '**???     
  2750. '*************************************************************************
  2751. DIM rc%
  2752. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2753.  
  2754.      rc% = LCBGetItem (hDlg&, CLng(index%), CLng(itemnum%), szValue$, cbSymValMax)
  2755.      Lot_LCBGetItem = NullTrim(szValue$)
  2756.  
  2757. END FUNCTION
  2758. '*************************************************************************
  2759.  
  2760. PUBLIC FUNCTION Lot_LCBToggleItem  (hDlg&, index%) AS INTEGER
  2761. '** Purpose:
  2762. '** Author:
  2763. '** Arguments:
  2764. '** Returns:
  2765. '**     
  2766. '*************************************************************************
  2767.    DIM rc%
  2768.  
  2769.    rc% = LCBToggleItem (hDlg&, CLng(index%))
  2770.    Lot_LCBToggleItem = rc%
  2771.  
  2772. END FUNCTION
  2773.  
  2774. '*************************************************************************
  2775.  
  2776. PUBLIC SUB Lot_LCBSetSel (hDlg&, index%)
  2777. ' wrapper 
  2778. '*************************************************************************
  2779.   LCBSetSel hDlg&, CLng(index%)
  2780. END SUB
  2781.  
  2782. '*************************************************************************
  2783.  
  2784. PUBLIC SUB Lot_LCBSetTabs (hDlg&, t1%, t2%, t3%, t4%)
  2785. ' wrapper 
  2786. '*************************************************************************
  2787.   LCBSetTabs hDlg&, CLng(t1%), CLng(t2%), CLng(t3%), CLng(t4%)
  2788. END SUB
  2789.  
  2790. '*************************************************************************
  2791.  
  2792. PUBLIC FUNCTION Lot_GetFirstChild (szChapt$, nFlag%) AS STRING
  2793. '** Purpose:
  2794. '** Author:
  2795. '** Arguments:
  2796. '** Returns:
  2797. '**     
  2798. '*************************************************************************
  2799. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2800.  
  2801.     if FGetFirstChild(szChapt$, szValue$, CLng(nFlag%)) = 0 then
  2802.      Lot_GetFirstChild = ""         
  2803.     else
  2804.      Lot_GetFirstChild = NullTrim(szValue$ )
  2805.     end if
  2806.  
  2807. END FUNCTION
  2808. '*************************************************************************
  2809.  
  2810. PUBLIC FUNCTION Lot_GetGroupName ( szGroupFileName$) AS STRING  
  2811. '** Purpose:
  2812. '** Author:
  2813. '** Arguments:
  2814. '** Returns:
  2815. '**     
  2816. '*************************************************************************
  2817.    DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2818.  
  2819.    IF FGetGroupName(szGroupFileName$, szValue$, cbSymValMax) = 0 THEN
  2820.       Lot_GetGroupName = ""
  2821.    ELSE
  2822.       Lot_GetGroupName = NullTrim(szValue$)
  2823.    END IF
  2824.  
  2825. END FUNCTION
  2826. '*************************************************************************
  2827.  
  2828. PUBLIC FUNCTION Lot_GetChapterValStr (szChapter$, nField%)  AS STRING 
  2829. '** Purpose:
  2830. '** Author:
  2831. '** Arguments:
  2832. '** Returns:
  2833. '**     
  2834. '*************************************************************************
  2835.    DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2836.  
  2837.    IF FGetChapterValStr(szChapter$, CLng(nField%), szValue$, cbSymValMax) = 0 THEN
  2838.       Lot_GetChapterValStr = ""
  2839.    ELSE
  2840.       Lot_GetChapterValStr = NullTrim(szValue$)
  2841.    END IF
  2842.  
  2843. END FUNCTION
  2844. '*************************************************************************
  2845.  
  2846. PUBLIC FUNCTION Lot_GetChapterValInt (szChapter$,nField%) AS INTEGER  
  2847. '** Purpose:
  2848. '** Author:
  2849. '** Arguments:
  2850. '** Returns:
  2851. '**     
  2852. '*************************************************************************
  2853.    DIM lpVal&
  2854.    
  2855.    if FGetChapterValInt(szChapter$, CLng(nField%),lpVal&) = 0 then
  2856.        Lot_GetChapterValInt = -1    
  2857.    else
  2858.       Lot_GetChapterValInt = CInt(lpVal&)
  2859.    end if
  2860.  
  2861. END FUNCTION
  2862. '*************************************************************************
  2863.  
  2864. PUBLIC FUNCTION Lot_GetNextSibling (szChapter$,nField%) AS STRING
  2865. '** Purpose:
  2866. '** Author:
  2867. '** Arguments:
  2868. '** Returns:
  2869. '**     
  2870. '*************************************************************************
  2871. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2872.  
  2873.     if FGetNextSibling(szChapter$, szValue$,CLng(nField%)) = 0 then
  2874.        Lot_GetNextSibling = ""  
  2875.     else
  2876.        Lot_GetNextSibling = NullTrim(szValue$)
  2877.     end if
  2878.  
  2879. END FUNCTION
  2880. '*************************************************************************
  2881.  
  2882. PUBLIC FUNCTION Lot_GetNextChild () AS STRING
  2883. '** Purpose:
  2884. '** Author:
  2885. '** Arguments:
  2886. '** Returns:
  2887. '**     
  2888. '*************************************************************************
  2889.    DIM g_strbuf$, Length%
  2890.  
  2891.    g_strbuf$ = CreateBuffer(256)
  2892.    if FGetNextChild(g_strbuf$) = 0 then
  2893.       Lot_GetNextChild = ""     
  2894.    else
  2895.       Lot_GetNextChild = NullTrim(g_strbuf$)
  2896.     end if
  2897.  
  2898. END FUNCTION
  2899. '*************************************************************************
  2900.  
  2901. PUBLIC FUNCTION Lot_GetInfChapterSize (szChapter$)  AS LONG
  2902. '** Purpose:
  2903. '** Author:
  2904. '** Arguments:
  2905. '** Returns:
  2906. '**     
  2907. '*************************************************************************
  2908.    DIM size&
  2909.  
  2910.    size&= LcbGetInfChapterSize(szChapter$)
  2911.    if size& = -1 then
  2912.      Lot_GetInfChapterSize = -1         
  2913.    else
  2914.      Lot_GetInfChapterSize = size&
  2915.    end if
  2916.  
  2917. END FUNCTION
  2918. '*************************************************************************
  2919.  
  2920. PUBLIC SUB Lot_ToggleChapterFilesInCopyList (szChapter$)  
  2921. '** Purpose:
  2922. '** Author:
  2923. '** Arguments:
  2924. '** Returns:
  2925. '**     
  2926. '*************************************************************************
  2927.  
  2928.    If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  2929.       ERROR STFTOGGLE
  2930.    End If
  2931.  
  2932. END SUB
  2933.  
  2934.  
  2935. '*************************************************************************
  2936.  
  2937. PUBLIC FUNCTION Lot_SetChapterFilesInCopyListInOrOut (szChapter$, InOrOut%) AS INTEGER
  2938. '** Purpose: Given a chapter, This function turns the feature on or off.
  2939. '**          It is written to be especially careful that features are not
  2940. '**          turned on if they are not allowed to be. Examples are:
  2941. '**          NODE: If the feaure doesn't exist on the Server
  2942. '**          ANY TYPE: If the feature is not in the INF file
  2943. '** Author: Marcel Meth
  2944. '** Arguments: szChapter$: The chapter number, e.g. "1.2.1"
  2945. '**               InOrOut: 1 for in, 0 for Out
  2946. '** Returns: Wheter the feature is actually In (1) or Out (0)
  2947. '**          regardless of what the request was.
  2948. '**     
  2949. '*************************************************************************
  2950. DIM curinorout%, FeatureToFind$
  2951.  
  2952.    If szChapter$ = "" Then
  2953.       Lot_SetChapterFilesInCopyListInOrOut  = 0
  2954.       Exit FUNCTION
  2955.    End If
  2956.  
  2957.    curinorout% = Lot_GetChapterValInt(szChapter$, F_INOROUT)
  2958.    '** If the current setting already equals the requested setting
  2959.    If InOrOut% = curinorout% Then
  2960.       Lot_SetChapterFilesInCopyListInOrOut  = InOrOut%
  2961.       Exit FUNCTION
  2962.    End If
  2963.  
  2964.    '** If the requested setting is IN
  2965.    If  InOrOut% = 1 THEN
  2966.       Lot_SetChapterFilesInCopyListInOrOut = 1
  2967.  
  2968.       '** For a node install, make sure the server has the feature
  2969.       If GetSymbolValue("NETWORK") = gNODE Then
  2970.      FeatureToFind$ = Lot_GetChapterValStr(szChapter$, F_KEYWORD)
  2971.      If Lot_IsTheFeatureInstalled(FeatureToFind$) = FALSE Then
  2972.         Lot_SetChapterFilesInCopyListInOrOut = 0
  2973.         Exit Function
  2974.      End If
  2975.       End If
  2976.  
  2977.       If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  2978.      Lot_SetChapterFilesInCopyListInOrOut = 0
  2979.       End If
  2980.  
  2981.    '** If the requested setting is OUT
  2982.    Else
  2983.       Lot_SetChapterFilesInCopyListInOrOut = 0
  2984.       If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  2985.      Lot_SetChapterFilesInCopyListInOrOut = 1
  2986.       End If
  2987.    End If
  2988.  
  2989. END FUNCTION
  2990.  
  2991.  
  2992. '*************************************************************************
  2993.  
  2994. PUBLIC SUB Lot_InitializeCopyList (szChpt$, nField%) 
  2995. '** Purpose:
  2996. '** Author:
  2997. '** Arguments:
  2998. '** Returns:
  2999. '**     
  3000. '*************************************************************************
  3001.    if FInitializeCopyList(szChpt$, GetSymbolValue(SYM_STF_SRCDIR$), CLng(nField%)) = 0 then
  3002.       ErrorMsg 0, "Error initializing the copylist: " + szChpt$
  3003.       ERROR STFQUIT
  3004.    end if
  3005. END SUB
  3006. '*************************************************************************
  3007.  
  3008. PUBLIC SUB Lot_InitializeWinWinsysSym () 
  3009. '** Purpose: Sets win and winsys symbols
  3010. '** Author:  MZ
  3011. '*************************************************************************
  3012. DIM systemDir$
  3013.  
  3014.    'Set Windows directory symbol
  3015.    systemDir$ = GetWindowsDir()
  3016.    SetSymbolValue SYM_WINDIR$, systemdir$
  3017.  
  3018.    'Get Windows System directory
  3019.    systemDir$ = GetWindowsSysDir()
  3020.  
  3021.    'Check if I can write to the window system dir. and set winsysdir symbol
  3022.    IF(IsDirWritable(systemDir$)) = 1 THEN
  3023.       SetSymbolValue SYM_WINSYSDIR$, systemDir$
  3024.    ELSE
  3025.       SetSymbolValue SYM_WINSYSDIR$, GetWindowsDir()
  3026.    END IF
  3027. END SUB
  3028.  
  3029. ''* INitialize the gEXTRA LIST to 200000 bytes for the windows drive.
  3030. PUBLIC SUB Lot_InitializeEXTRA
  3031.     DIM drv$, drvno%, i%
  3032.    '' Add extra "FUDGE" space on Windows drive to allow for activities
  3033.    '' in windows directory.
  3034.    If GetListLength(gEXTRA) = 0 Then
  3035.       drv$ = Lot_ExtractDriveLetter(GetWindowsDir())
  3036.       drvno% = ASC(drv$) - ASC("a") + 1
  3037.       FOR i% = 1 to 26
  3038.      If i% = drvno% Then
  3039.         AddlistItem gEXTRA, "200000"
  3040.      Else
  3041.         AddlistItem gEXTRA, ""
  3042.      End If
  3043.       NEXT
  3044.    End If
  3045. END SUB
  3046.  
  3047. PUBLIC SUB Lot_RefreshDestination (symbol$) 
  3048. '** Purpose:
  3049. '** Author:
  3050. '** Arguments:
  3051. '** Returns:
  3052. '**     
  3053. '*************************************************************************
  3054.    if FRefreshDestination(symbol$) = FALSE THEN
  3055.       ErrorMsg 0, "Lot_RefreshDestination error: " + symbol$
  3056.       ERROR STFQUIT
  3057.    end if
  3058. END SUB
  3059.  
  3060. '*************************************************************************
  3061. PUBLIC SUB Lot_WriteDestinationSymAndVal (IniFileName$,IniSection$) 
  3062. '** Purpose:
  3063. '** Author:
  3064. '** Arguments:
  3065. '** Returns:
  3066. '**     
  3067. '*************************************************************************
  3068.    if FWriteDestinationSymAndVal(IniFileName$,IniSection$) = FALSE THEN
  3069.       ErrorMsg 0, "Lot_WriteDestinationSymAndVal error."
  3070.       ERROR STFQUIT
  3071.    end if
  3072. END SUB
  3073. '*************************************************************************
  3074.  
  3075. PUBLIC SUB Lot_GetDriveFreeSpaceList (szSymbol$)
  3076. '** Purpose: Creates a list of available drives, with space available
  3077. '** Author:
  3078. '** Arguments: sySymbol$        Name of list
  3079. '**     
  3080. '*************************************************************************
  3081. DIM     i%, nd%, rc$
  3082.    if FGetDriveFreeSpaceList(szSymbol$) = FALSE THEN
  3083.       ErrorMsg SID_ERR_LOT_GDFSL, ""
  3084.       ERROR STFQUIT
  3085.    end if
  3086. END SUB
  3087.  
  3088. PUBLIC FUNCTION Lot_AddToDriveFreeSpaceList (szSymbol$, szNewItem$) AS LONG
  3089. '** Purpose:Add a drive to a drive free space combo control 
  3090. '** Author:GJL
  3091. '** Arguments:szSymbol$ symbol for combo control
  3092. '**             szNewItem$ drive or UNC volume to add
  3093. '** Returns:TRUE if successful 
  3094. '**     
  3095. '*************************************************************************
  3096. DIM ret&
  3097.    ret& = FAddToDriveFreeSpaceList(szSymbol$, szNewItem$)
  3098.    IF ret& = 0 THEN
  3099.     Lot_AddToDriveFreeSpaceList = FALSE
  3100.    ELSE
  3101.     Lot_AddToDriveFreeSpaceList  = TRUE
  3102.    END IF
  3103. END FUNCTION
  3104. '*************************************************************************
  3105.  
  3106.  
  3107. '**UNC stuff
  3108. PUBLIC FUNCTION Lot_IsUnvalidatedUNCPath(szPath$) AS LONG
  3109. '** Purpose:Checks for 2 leading backslashes on a path
  3110. '** Author:GJL
  3111. '** Arguments:szPath$ a path
  3112. '** Returns:
  3113. '**     
  3114. '*************************************************************************
  3115.    IF FIsUnvalidatedUNCPath(szPath$) = 1 THEN
  3116.     Lot_IsUnvalidatedUNCPath = TRUE
  3117.    ELSE   
  3118.     Lot_IsUnvalidatedUNCPath = FALSE
  3119. END IF
  3120. END FUNCTION
  3121.  
  3122. PUBLIC FUNCTION Lot_IsValidUNCPath(szPath$) AS LONG
  3123. '** Purpose:determine whether a UNC volume is valid
  3124. '** Author:GJL
  3125. '** Arguments:A UNC volume with no trailing backslash
  3126. '** Returns:
  3127. '**     
  3128. '*************************************************************************
  3129.    IF FIsValidUNCPath(szPath$) = 1 THEN
  3130.     Lot_IsValidUNCPath = TRUE
  3131.    ELSE
  3132.     Lot_IsValidUNCPath = FALSE
  3133.    END IF
  3134. END FUNCTION
  3135.  
  3136. '**end UNC stuff
  3137.  
  3138.  
  3139. PUBLIC FUNCTION PopupModelessDlg (Dlg%, HelpID&) AS STRING
  3140. '** Purpose:
  3141. '** Author:
  3142. '** Arguments:
  3143. '** Returns:
  3144. '*************************************************************************
  3145.    DIM cuidll$, szWnd$, notused$, notused1%
  3146.  
  3147.  '-   cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3148.  ' JMD
  3149.  ' SYM_CUIDLL is now a list of DLLs
  3150.  ' First one contains code (dialog procs) and common resources
  3151.  ' Others contain product specific resources
  3152.  'NOTE: common DLL MUST be listed FIRST in the INI file
  3153.  '------------------------------
  3154.     cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3155.  
  3156.    'UIStartDlg(cuidll$, Dlg&, "FNameOrgDlgProc", APPHELP, "FHelpDlgProc")
  3157.    notused$ = UIStartDlg(cuidll$, Dlg%, FNAMEORGDLGPROC$, 0, "")
  3158.  
  3159.    ''Make sure the dialog gets fully painted
  3160.    szWnd$ = GetSymbolValue(SYM_WNDHANDLE$)
  3161.    notused1% = SendMessage(VAL(szWnd$),UM_PAINTMODELESS,0,0)
  3162. END FUNCTION
  3163.  
  3164. PUBLIC FUNCTION PopupWithFunction (Dlg%, HelpID&, Func$) AS STRING
  3165. '** Purpose:   Surface modal dialog box
  3166. '** Author:
  3167. '** Arguments:  Dlg%      ID of dialog template
  3168. '**             HelpID&   ID of help topic
  3169. '**             Func$     Dialog procedure name
  3170. '** Returns:     Exit string
  3171. '*************************************************************************
  3172.     DIM cuidll$, sz$, cdir$, notused%
  3173.  
  3174.  ' JMD
  3175.  ' SYM_CUIDLL is now a list of DLLs
  3176.  ' First one contains code (dialog procs) and common resources
  3177.  ' Others contain product specific resources
  3178.  'NOTE: common DLL MUST be listed FIRST in the INI file
  3179.  '------------------------------
  3180.  
  3181.     If GetSymbolValue(SYM_AUTOMATIONINST$) = gTRUE$ Then EXIT FUNCTION
  3182.     
  3183.     cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3184.     DO
  3185.         sz$ = UIStartDlg(cuidll$, Dlg%, Func$, 0, "")
  3186.  
  3187.         SELECT CASE sz$
  3188.         case "IDC_EXIT"
  3189.             notused% = FRemoveSymbol("IDC_TEXT")
  3190.             QUIT
  3191.             SetListItem "__DLG_ID", 1, STR(Dlg%)
  3192.         case "IDC_CANCEL" 
  3193.             EXIT DO
  3194.         case "IDC_CONTINUE" 
  3195.             EXIT DO
  3196.         case "IDC_OK" 
  3197.             EXIT DO
  3198.         case "IDC_MENU"
  3199.             EXIT DO
  3200.         case "IDC_BACK"
  3201.             EXIT DO
  3202.         case "IDC_CITHELP"
  3203.             cdir$ = GetSymbolValue(SYM_STF_CWDDIR$) + gINSTALLHLP$
  3204.             notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_CONTEXT, HelpID&)
  3205.             SetListItem "RETFROMHELP", 1, "T"
  3206.         case "HELPKEY" 
  3207.             cdir$ = GetSymbolValue(SYM_STF_CWDDIR$) + gINSTALLHLP$
  3208.             notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_CONTEXT, HelpID&)
  3209.             SetListItem "RETFROMHELP", 1, "T"
  3210.         END SELECT
  3211.     LOOP
  3212.     PopupWithFunction = MID$(sz$,5,LEN(sz$)-4)
  3213.     UIPop 1
  3214.     notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_QUIT, HelpID&)
  3215. END FUNCTION
  3216.  
  3217. PUBLIC FUNCTION PopupModalDlg (Dlg%, HelpID&) AS STRING
  3218. '** Purpose:
  3219. '** Author:
  3220. '** Arguments:
  3221. '** Returns:
  3222. '*************************************************************************
  3223.     PopupModalDlg=PopupWithFunction(Dlg%, HelpID&, FNAMEORGDLGPROC$)
  3224. END FUNCTION
  3225.  
  3226. PUBLIC FUNCTION RegisterCallback (ModName$, FuncName$) AS INTEGER
  3227. '** Purpose:
  3228. '** Author:
  3229. '** Arguments:
  3230. '** Returns:
  3231. '*************************************************************************
  3232.   DIM rc%, automation$
  3233.  
  3234.   automation$ = GetSymbolValue(SYM_AUTOMATIONINST$)
  3235.   If  automation$ <> gTRUE$ Then
  3236.     RemoveSymbol(SYM_CALLBACK$)
  3237.     AddListItem SYM_CALLBACK$, FuncName$
  3238.     rc% = RegisterFunction(LSI_INFO(4),ModName$,FuncName$)
  3239.     If rc% = -4 Then
  3240.       ErrorMsg 0, "Maximum Number of Callbacks exceeded"
  3241.     End If
  3242.   End If
  3243. END FUNCTION
  3244.  
  3245. '*************************************************************************
  3246. '** FUNCTION SelectDriveCombo (ComboID$, path$)
  3247. '** Purpose:    Sets the ComboID dropdown to drive$
  3248. '**
  3249. '** IN SYMBOLS   Expects SYM_UPDATELIST$ to have an "ALL" entry
  3250. '**                 otherwise dropdown combo code asserts
  3251. '** OUT SYMBOLS  Adds 2 entries to the UPDATELIST 
  3252. '**     
  3253. '** Author:  Marcel Meth
  3254. '** Arguments:    ComboId$ - Id of the combo being set e.g. "IDC_COMBO1"
  3255. '**               path$ - Path that includes a drive letter or UNC vol.
  3256. '**     
  3257. '** If drive is not in combo box it will be added 
  3258. '**
  3259. '** Returns:  Index of the drive letter in the combo
  3260. '**     
  3261. '*************************************************************************
  3262. PUBLIC FUNCTION SelectDriveCombo (ComboID$, path$) AS INTEGER
  3263.    DIM n%, i%, drv$, dirpath$, position&, addRet&
  3264.    DIM FirstDriveLetter$
  3265.  
  3266.    n% = GetListLength(ComboID$)
  3267.    SelectDriveCombo = 1
  3268.    drv$ = Lot_ExtractDriveLetter(path$)
  3269. '** 
  3270. '** UNC path
  3271. '** 
  3272.    IF drv$ = "\" THEN
  3273.      Lot_SplitUNCPath path$, drv$, dirpath$
  3274.      IF Lot_IsvalidUNCPath(drv$) = FALSE THEN
  3275.        SelectDriveCombo = FALSE
  3276.        Exit FUNCTION
  3277.      END IF
  3278.      For i% = 1 to n%
  3279.        position& = InStr(LCASE$(GetListItem(ComboID$, i%)), LCASE$(drv$)) 
  3280.        If 0 < position Then
  3281.      AddListItem SYM_UPDATELIST$, ComboID$ 
  3282.      AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3283.      SelectDriveCombo = i%
  3284.      EXIT FUNCTION
  3285.        End If
  3286.      NEXT
  3287.      addRet& = Lot_AddToDriveFreeSpaceList(ComboID$, drv$)
  3288.      IF addRet&  = TRUE THEN
  3289.        i% = GetListLength(ComboID$)
  3290.        AddListItem SYM_UPDATELIST$, ComboID$ 
  3291.        AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3292.        SelectDriveCombo = i%
  3293.      ELSE 
  3294.        SelectDriveCombo = FALSE
  3295.      END IF
  3296. '** 
  3297. '** Drive letter given
  3298. '** 
  3299.    ELSE
  3300.      For i% = 1 to n%
  3301.        If drv$ = LCASE$(MID(GetListItem(ComboID$, i%), 1, 1)) Then
  3302.      AddListItem SYM_UPDATELIST$, ComboID$ 
  3303.      AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3304.      SelectDriveCombo = i% 
  3305.      EXIT FUNCTION
  3306.        End If
  3307.      Next
  3308. '** 
  3309. '** Drive not found in list
  3310. '** 
  3311.      IF Lot_AddToDriveFreeSpaceList(ComboID$, drv$)  = FALSE THEN
  3312.        SelectDriveCombo = FALSE
  3313.      ELSE
  3314.        i% = GetListLength(ComboID$)
  3315.        AddListItem SYM_UPDATELIST$, ComboID$ 
  3316.        AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3317.        SelectDriveCombo = i%
  3318.      END IF
  3319.    END IF
  3320.  
  3321. END FUNCTION
  3322.  
  3323. PUBLIC FUNCTION CheckForSpace(DlgId%) AS INTEGER
  3324. '** Purpose: Checks to see if there is enough space on dest directories
  3325. '**          First does a cheap check, followed, if need be by a high
  3326. '**          granularity check.
  3327. '** Author: Marcel Meth
  3328. '** Arguments:
  3329. '**     
  3330. '**     
  3331. '** Returns: SUCCESS/FAILURE
  3332. '**     
  3333. '*************************************************************************
  3334.     DIM lTicks&, lcb&, lNew&, i%, j%, lcbNeed&, dr$, s$, helpId&, rc$
  3335.     DIM notused1$, curcursor&, UNCSym$
  3336.  
  3337.    '** Try a quick check
  3338.    CheckForSpace = SUCCESS
  3339.    lTicks&       = GetTickCount()
  3340.    lcb&          = LcbGetChapterCost("", "", SYM_COST$, SYM_NEEDED$)
  3341.    IF lcb& = CLNG(0) THEN
  3342.       DO '** Keep the modeless up at least 2 seconds
  3343.      lNew& = GetTickCount()
  3344.       LOOP UNTIL (lNew& - lTicks&) > 2000
  3345.       DisplayWhenSpaceIsTight SYM_COST$, SYM_NEEDED$
  3346.       GOTO ENDCHECK
  3347.    END IF
  3348.    '** Try A High Granularity Check
  3349.    curcursor& = ShowWaitCursor()
  3350.    SetListItem "IDC_BMP", 1, STR$(IDD_MAXSCAN_BMP) '** put up the bitmap
  3351.    notused1$ = PopupModelessDlg(DB_CHECKSPACE, DB_CHECKSPACE)
  3352.    lcb& = GetCopyListCost (gEXTRA, SYM_COST$, SYM_NEEDED$)
  3353.    UIPOP 1     '** Bring down DB_CHECKSPACE
  3354.    RestoreCursor curcursor&
  3355.    IF lcb& = CLNG(0) THEN
  3356.       DisplayWhenSpaceIsTight SYM_COST$, SYM_NEEDED$
  3357.       GOTO ENDCHECK
  3358.    END IF
  3359.  
  3360.    '** If you get here then there was not enough space (Tab is CHR$(9))
  3361.    CheckForSpace = FAILURE
  3362.    RemoveSymbol "IDC_LIST1"
  3363.    FOR i% = 1 TO 26
  3364.       lcbNeed& = CLNG(GetListItem(SYM_NEEDED$, i%))
  3365.       IF  lcbNeed& > 0 THEN
  3366.      dr$ = CHR$(ASC("A")+i%-1) + ":" + CHR$(9)
  3367.      s$  = dr$ & (lcbNeed& + 4)
  3368.      AddlistItem "IDC_LIST1", s$ + gStrK$
  3369.       END IF
  3370.    NEXT
  3371.    j%=GetListLength("UNCVOLLIST")
  3372.    FOR i% = 1 to j%
  3373.       UNCSym$ = GetListItem("UNCVOLLIST",i%)
  3374.       lcbNeed& = CLNG(GetListItem(UNCSym$, 3))
  3375.       IF lcbNeed&  > 0 THEN
  3376.          IF IsDBCSFirstAtOffset(UNCSym$, 18) = 0 THEN
  3377.             s$ = Left(UNCSym$, 18)
  3378.          ELSE
  3379.             s$ = Left(UNCSym$, 17)
  3380.          END IF
  3381.          s$ = s$ & CHR$(9) & (lcbNeed& + 4)
  3382.      AddlistItem "IDC_LIST1", s$ + gStrK$
  3383.       END IF
  3384.    NEXT
  3385.  
  3386.  
  3387.    SetListItem "SETTABS1",1,"50"
  3388.    SetListItem "NORMALFONT", 1, STR$(IDC_TEXT1)
  3389.    SetListItem "NORMALFONT", 2, STR$(IDC_TEXT2)
  3390.    SetListItem "NORMALFONT", 3, STR$(IDC_TEXT3)
  3391.  
  3392.    helpId& = DlgId%
  3393.    rc$ = PopupModalDlg (DlgId%, helpId&)
  3394.  
  3395. ENDCHECK:
  3396.    RemoveSymbol(SYM_COST$)
  3397.    RemoveSymbol(SYM_NEEDED$)
  3398.  
  3399. END FUNCTION
  3400.  
  3401. '*************************************************************************
  3402. '** SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  3403. '**
  3404. '** Purpose:    Display a warning message when disk space is tight
  3405. '**             You should only call this sub if you think there is
  3406. '**             enough disk space. This means that we will assume that
  3407. '**             szNeed$ contains only negative numbers.
  3408. '**
  3409. '**             The message will be displayed if 110% of cost will not
  3410. '**             fit on any one disk.
  3411. '**
  3412. '** Arguments:  szCost$ and szNeed$ - Symbols for cost and need
  3413. '**             Both symbol lists are expected to contain 26 numbers
  3414. '**     
  3415. '** Author:     DND
  3416. '**     
  3417. '*************************************************************************
  3418.  
  3419. PUBLIC SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  3420.    DIM i%, lcbCost&, lcbNeed&, sz$, retcode%
  3421.    FOR i% = 1 TO 26
  3422.       lcbCost& =  (CLNG(GetListItem(szCost$, i%)) \ 1024) \ 10
  3423.       lcbNeed& = -CLNG(GetListItem(szNeed$, i%))
  3424.       IF lcbCost& > lcbNeed& THEN
  3425.      sz$ = LdString(SID_WARN_DISKSPACE1) + _
  3426.            LdString(SID_WARN_DISKSPACE2) + _
  3427.            LdString(SID_WARN_DISKSPACE3)
  3428.      'MessageBox sz$, MB_OK+MB_ICONINFORMATION, LdString(SID_TKT_STD_TITLE)
  3429.      retcode% = DoMsgBox(sz$,LdString(SID_TKT_STD_TITLE),MB_OKCANCEL _
  3430.                    +MB_ICONINFORMATION)
  3431.             if retcode% = IDCANCEL then
  3432.                 QUIT
  3433.             end if
  3434.      EXIT FOR
  3435.       END IF
  3436.    NEXT
  3437.  
  3438. END SUB
  3439.  
  3440. '******** Microsoft Functions that Lotus re-wrote **************************
  3441.  
  3442.  
  3443.  
  3444. PUBLIC SUB ReadInfFile (szFile$) 
  3445. '** Purpose:
  3446. '** Author:
  3447. '** Arguments: szFile$
  3448. '*************************************************************************
  3449. %rem
  3450. '    if FValidFATPath(szFile$) = 0 then
  3451. '        BadArgErr 1, "ReadInfFile", szFile$
  3452. '    end if
  3453. '    IF FOpenInf(szFile$, 1, 1) = 0 THEN
  3454. '        StfApiErr saeFail, "ReadInfFile", szFile$
  3455. %endrem
  3456.     IF FOpenInf(szFile$, 1, 0) = 0 THEN
  3457.     ErrorMsg SID_ERR_READINFFILE, ""
  3458.     ERROR STFQUIT
  3459.     END IF
  3460. END SUB
  3461.  
  3462. PUBLIC SUB MakeListFromSectionKeys(szSymbol$, szSect$) 
  3463. '** Purpose:
  3464. '** Author:
  3465. '** Arguments: szSymbol$, szSect$
  3466. '*************************************************************************
  3467. %rem
  3468.     if szSymbol$ = "" then
  3469.     n% = 1
  3470.     elseif FValidInfSect(szSect$) = 0 then
  3471.     n% = 2
  3472.     else
  3473.     n% = 0
  3474.     end if
  3475.     if n% > 0 then
  3476.     BadArgErr n%, "MakeListFromSectionKeys", szSymbol$+", "+szSect$
  3477.     end if
  3478. %endrem ''DEBUG
  3479.  
  3480.     IF FSetSymbolToListOfInfKeys(szSymbol$, szSect$, 1) = 0 THEN
  3481.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONKEYS, ""
  3482.     ERROR STFQUIT
  3483.     END IF
  3484. END SUB
  3485.  
  3486. PUBLIC SUB MakeListFromSectionDate (szSym$, szSect$) 
  3487. '** Purpose:
  3488. '** Author:
  3489. '** Arguments: szSym$, szSect$
  3490. '** Returns:
  3491. '**     
  3492. '*************************************************************************
  3493. %rem
  3494.     if szSym$ = "" then
  3495.     n% = 1
  3496.     elseif FValidInfSect(szSect$) = 0 then
  3497.     n% = 2
  3498.     else
  3499.     n% = 0
  3500.     end if
  3501.     if n% > 0 then
  3502.     BadArgErr n%, "MakeListFromSectionDate", szSym$+", "+szSect$
  3503.     end if
  3504. %endrem ''DEBUG
  3505.  
  3506.     IF FMakeListInfSectionField(szSym$, szSect$, 5) = 0 THEN
  3507.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONDATE, ""
  3508.     ERROR STFQUIT
  3509.     END IF
  3510. END SUB
  3511.  
  3512. PUBLIC SUB MakeListFromSectionFilename (szSym$, szSect$) 
  3513. '** Purpose:
  3514. '** Author:
  3515. '** Arguments: szSym$, szSect$
  3516. '** Returns:
  3517. '**     
  3518. '*************************************************************************
  3519. %rem
  3520.     if szSym$ = "" then
  3521.     n% = 1
  3522.     elseif FValidInfSect(szSect$) = 0 then
  3523.     n% = 2
  3524.     else
  3525.     n% = 0
  3526.     end if
  3527.     if n% > 0 then
  3528.     BadArgErr n%, "MakeListFromSectionFilename", szSym$+", "+szSect$
  3529.     end if
  3530. %endrem ''DEBUG
  3531.  
  3532.     IF FMakeListInfSectionField(szSym$, szSect$, 1) = 0 THEN
  3533.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONFILENAME, ""
  3534.     ERROR STFQUIT
  3535.     END IF
  3536. END SUB
  3537.  
  3538. PUBLIC SUB MakeListFromSectionSize (szSym$, szSect$) 
  3539. '** Purpose:
  3540. '** Author:
  3541. '** Arguments: szSym$, szSect$
  3542. '** Returns:
  3543. '**     
  3544. '*************************************************************************
  3545. %rem
  3546.     if szSym$ = "" then
  3547.     n% = 1
  3548.     elseif FValidInfSect(szSect$) = 0 then
  3549.     n% = 2
  3550.     else
  3551.     n% = 0
  3552.     end if
  3553.     if n% > 0 then
  3554.     BadArgErr n%, "MakeListFromSectionSize", szSym$+", "+szSect$
  3555.     end if
  3556. %endrem ''DEBUG
  3557.  
  3558.     IF FMakeListInfSectionField(szSym$, szSect$, 15) = 0 THEN
  3559.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONSIZE, ""
  3560.     ERROR STFQUIT
  3561.     END IF
  3562. END SUB
  3563.  
  3564. PUBLIC SUB MakeListFromSectionVersion (szSym$, szSect$) 
  3565. '** Purpose:
  3566. '** Author:
  3567. '** Arguments: szSym$, szSect$
  3568. '** Returns:
  3569. '**     
  3570. '*************************************************************************
  3571. %rem
  3572.     if szSym$ = "" then
  3573.     n% = 1
  3574.     elseif FValidInfSect(szSect$) = 0 then
  3575.     n% = 2
  3576.     else
  3577.     n% = 0
  3578.     end if
  3579.     if n% > 0 then
  3580.     BadArgErr n%, "MakeListFromSectionVersion", szSym$+", "+szSect$
  3581.     end if
  3582. %endrem ''DEBUG
  3583.  
  3584.     IF FMakeListInfSectionField(szSym$, szSect$, 19) = 0 THEN
  3585.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONVERSION, ""
  3586.     ERROR STFQUIT
  3587.     END IF
  3588. END SUB
  3589.  
  3590. PUBLIC FUNCTION SetSilentMode (mode%)  AS INTEGER
  3591. '** Purpose:
  3592. '** Author:
  3593. '** Arguments: mode%
  3594. '** Returns:
  3595. '**     
  3596. '*************************************************************************
  3597.     DIM temp&
  3598.  
  3599.     temp& = CLNG ( mode% )
  3600.     SetSilentMode = FSetSilent( temp& )
  3601. END FUNCTION
  3602.  
  3603. PUBLIC FUNCTION SetBeepingMode (mode%)  AS INTEGER
  3604. '** Purpose:
  3605. '** Author:
  3606. '** Arguments: mode%
  3607. '** Returns:
  3608. '**     
  3609. '*************************************************************************
  3610.     DIM temp&
  3611.  
  3612.     temp& = CLNG ( mode% )
  3613.  
  3614.     SetBeepingMode = FSetBeepingMode( temp& )
  3615. END FUNCTION
  3616.  
  3617. PUBLIC FUNCTION GetSectionKeyDate (szSect$, szKey$)  AS STRING
  3618. '** Purpose:
  3619. '** Author:
  3620. '** Arguments: szSect$, szKey$
  3621. '** Returns:
  3622. '**     
  3623. '*************************************************************************
  3624. %rem
  3625.     if FValidInfSect(szSect$) = 0 then
  3626.     n% = 1
  3627.     elseif szKey$ = "" then
  3628.     n% = 2
  3629.     else
  3630.     n% = 0
  3631.     end if
  3632.     if n% > 0 then
  3633.     BadArgErr n%, "GetSectionKeyDate", szSect$+", "+szKey$
  3634.     end if
  3635. %endrem ''DEBUG
  3636.     DIM szBuf$, Length&
  3637.  
  3638.     szBuf$ = string$(128, 32) 
  3639.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 5, szBuf$, 128)
  3640.     IF Length& >= 128 THEN
  3641.     ErrorMsg SID_ERR_GETSECTIONKEYDATE, ""
  3642.     ERROR STFQUIT
  3643.     END IF
  3644.  
  3645.     IF Length& = -1 THEN
  3646.     ErrorMsg SID_ERR_GETSECTIONKEYDATE2, ""
  3647.     ERROR STFQUIT
  3648.     END IF
  3649.  
  3650.     GetSectionKeyDate = LEFT$ (szBuf$, CInt(Length&))
  3651.     szBuf$ = ""
  3652. END FUNCTION
  3653.  
  3654. PUBLIC FUNCTION GetSectionKeyFilename (szSect$, szKey$)  AS STRING
  3655. '** Purpose:
  3656. '** Author:
  3657. '** Arguments: szSect$, szKey$
  3658. '** Returns:
  3659. '**     
  3660. '*************************************************************************
  3661. %rem
  3662.     if FValidInfSect(szSect$) = 0 then
  3663.     n% = 1
  3664.     elseif szKey$ = "" then
  3665.     n% = 2
  3666.     else
  3667.     n% = 0
  3668.     end if
  3669.     if n% > 0 then
  3670.     BadArgErr n%, "GetSectionKeyFilename", szSect$+", "+szKey$
  3671.     end if
  3672. %endrem ''DEBUG
  3673.     DIM szBuf$, Length&
  3674.  
  3675.     szBuf$ = string$(128, 32)
  3676.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 1, szBuf$, 128)
  3677.     IF Length& >= 128 THEN
  3678.     ErrorMsg SID_ERR_GETSECTIONKEYFILENAME, ""
  3679.     ERROR STFQUIT
  3680.     END IF
  3681.  
  3682.     IF Length& = -1 THEN
  3683.     ErrorMsg SID_ERR_GETSECTIONKEYFILENAME2, ""
  3684.     ERROR STFQUIT
  3685.     END IF
  3686.  
  3687.     GetSectionKeyFilename = LEFT$ (szBuf$, CInt(Length&) )
  3688.     szBuf$ = ""
  3689. END FUNCTION
  3690.  
  3691. PUBLIC FUNCTION GetSectionKeySize (szSect$, szKey$)  AS LONG
  3692. '** Purpose:
  3693. '** Author:
  3694. '** Arguments: szSect$, szKey$
  3695. '** Returns:
  3696. '**     
  3697. '*************************************************************************
  3698. %rem
  3699.     if FValidInfSect(szSect$) = 0 then
  3700.     n% = 1
  3701.     elseif szKey$ = "" then
  3702.     n% = 2
  3703.     else
  3704.     n% = 0
  3705.     end if
  3706.     if n% > 0 then
  3707.     BadArgErr n%, "GetSectionKeySize", szSect$+", "+szKey$
  3708.     end if
  3709. %endrem ''DEBUG
  3710.     DIM szBuf$, Length&
  3711.  
  3712.     szBuf$ = string$(128, 32)
  3713.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 15, szBuf$, 128)
  3714.     IF Length& >= 128 THEN
  3715.     ErrorMsg SID_ERR_GETSECTIONKEYSIZE, ""
  3716.     ERROR STFQUIT
  3717.     END IF
  3718.  
  3719.     IF Length& = -1 THEN
  3720.     ErrorMsg SID_ERR_GETSECTIONKEYSIZE2, ""
  3721.     ERROR STFQUIT
  3722.     END IF
  3723.     
  3724.     GetSectionKeySize = VAL (LEFT$ (szBuf$, CInt(Length&)) )
  3725.     szBuf$ = ""
  3726. END FUNCTION
  3727.  
  3728. PUBLIC FUNCTION GetSectionKeyVersion (szSect$, szKey$)  AS STRING
  3729. '** Purpose:
  3730. '** Author:
  3731. '** Arguments: szSect$, szKey$
  3732. '** Returns:
  3733. '**     
  3734. '*************************************************************************
  3735. %rem
  3736.     if FValidInfSect(szSect$) = 0 then
  3737.     n% = 1
  3738.     elseif szKey$ = "" then
  3739.     n% = 2
  3740.     else
  3741.     n% = 0
  3742.     end if
  3743.     if n% > 0 then
  3744.     BadArgErr n%, "GetSectionKeyVersion", szSect$+", "+szKey$
  3745.     end if
  3746. %endrem ''DEBUG
  3747.     DIM szBuf$, Length&
  3748.  
  3749.     szBuf$ = string$(128, 32) 
  3750.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 19, szBuf$, 128)
  3751.     IF Length& >= 128 THEN
  3752.     ErrorMsg SID_ERR_GETSECTIONKEYVERSION, ""
  3753.     ERROR STFQUIT
  3754.     END IF
  3755.  
  3756.     IF Length& = -1 THEN
  3757.     ErrorMsg SID_ERR_GETSECTIONKEYVERSION2, ""
  3758.     ERROR STFQUIT
  3759.     END IF
  3760.  
  3761.     GetSectionKeyVersion = LEFT$ (szBuf$, CInt(Length&))
  3762.     szBuf$ = ""
  3763. END FUNCTION
  3764.  
  3765. PUBLIC SUB RemoveDir (szDir$, cmo%) 
  3766. '** Purpose:
  3767. '** Author:
  3768. '** Arguments: szDir$, cmo%
  3769. '*************************************************************************
  3770. %rem
  3771.     if FValidFATDir(szDir$) = 0 then
  3772.     BadArgErr 1, "RemoveDir", szDir$+", "+STR$(cmo%)
  3773.     end if
  3774. %endrem ''DEBUG
  3775.     IF FRemoveDir(szDir$) = 0 THEN
  3776.     ErrorMsg SID_ERR_REMOVEDIR, ""
  3777.     ERROR STFERR
  3778.     END IF
  3779. END SUB
  3780.  
  3781. PUBLIC SUB DumpCopyList (szFile$) 
  3782. '** Purpose:
  3783. '** Author:
  3784. '** Arguments: szFile$
  3785. '*************************************************************************
  3786. %rem
  3787.     if szFile$ = "" then
  3788.     BadArgErr 1, "DumpCopyList", szFile$
  3789.     end if
  3790. %endrem ''DEBUG
  3791.     IF FDumpCopyListToFile (szFile$) = 0 THEN
  3792.     ErrorMsg SID_ERR_DUMPCOPYLIST, ""
  3793.     ERROR STFERR
  3794.     END IF
  3795. END SUB
  3796.  
  3797. PUBLIC SUB ClearCopyList 
  3798. '** Purpose:
  3799. '** Author:
  3800. '** Arguments: None
  3801. '*************************************************************************
  3802.     ResetCopyList
  3803. END SUB
  3804.  
  3805. PUBLIC FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$)  AS LONG
  3806. '** Purpose:
  3807. '** Author:
  3808. '** Arguments: szExtraList$, szCostList$, szNeedList$
  3809. '** Returns:
  3810. '**     
  3811. '*************************************************************************
  3812.     DIM lNeed&
  3813.  
  3814.     lNeed& = LcbGetCopyListCost (szExtraList$, szCostList$, szNeedList$)
  3815.     IF lNeed& < 0 THEN
  3816.     ErrorMsg SID_ERR_GETCOPYLISTCOST, ""
  3817.     ERROR STFQUIT
  3818.     END IF
  3819.     GetCopyListCost = lNeed&
  3820. END FUNCTION
  3821.  
  3822. PUBLIC SUB CopyFilesInCopyList 
  3823. '** Purpose:
  3824. '** Author:
  3825. '** Arguments:
  3826. '** Returns:
  3827. '**     
  3828. '*************************************************************************
  3829.     DIM grc&, notused%
  3830.  
  3831.     notused% = RemovePriorVersion("begin","execution")
  3832.  
  3833.     grc& = GrcCopyFilesInCopyList (HinstFrame())
  3834.  
  3835.     IF grc& = grcUserQuit THEN
  3836.     ErrorMsg SID_ERR_NOT_COMPLETE, ""
  3837.     ERROR STFQUIT
  3838.     ELSEIF grc& > 0 THEN
  3839.     ErrorMsg SID_ERR_NOT_COMPLETE, ""
  3840.     ERROR STFQUIT
  3841.     END IF
  3842. END SUB
  3843.  
  3844. PUBLIC SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$) 
  3845. '** Purpose:
  3846. '** Author:
  3847. '** Arguments:
  3848. '** Returns:
  3849. '**     
  3850. '*************************************************************************
  3851. %rem
  3852.     if FValidInfSect(szSect$) = 0 then
  3853.     n% = 1
  3854.     elseif FValidFATDir(szSrc$) = 0 then
  3855.     n% = 2
  3856.     elseif FValidFATDir(szDest$) = 0 then
  3857.     n% = 3
  3858.     else
  3859.     n% = 0
  3860.     end if
  3861.     if n% > 0 then
  3862.     BadArgErr n%, "AddSectionFilesToCopyList", szSect$+", "+szSrc$+", "+szDest$
  3863.     end if
  3864. %endrem ''DEBUG
  3865.  
  3866.     IF FAddSectionFilesToCopyList (szSect$, szSrc$, szDest$) = 0 THEN
  3867.  
  3868.     ErrorMsg SID_ERR_ADDSECTIONFILESTOCOPYLIST, ""
  3869.     ERROR STFQUIT
  3870.     END IF
  3871. END SUB
  3872. '*************************************************************************
  3873.  
  3874. PUBLIC SUB AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) 
  3875. '** Purpose:
  3876. '** Author:
  3877. '** Arguments:
  3878. '** Returns:
  3879. '**     
  3880. '*************************************************************************
  3881. %rem
  3882.     if FValidInfSect(szSect$) = 0 then
  3883.     n% = 1
  3884.     elseif szKey$ = "" then
  3885.     n% = 2
  3886.     elseif FValidFATDir(szSrc$) = 0 then
  3887.     n% = 3
  3888.     elseif FValidFATDir(szDest$) = 0 then
  3889.     n% = 4
  3890.     else
  3891.     n% = 0
  3892.     end if
  3893.     if n% > 0 then
  3894.     BadArgErr n%, "AddSectionKeyFileToCopyList", szSect$+", "+szKey$+", "+szSrc$+", "+szDest$
  3895.     end if
  3896. %endrem ''DEBUG
  3897.  
  3898.     IF FAddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) = 0 THEN
  3899.     ErrorMsg SID_ERR_ADDSECTIONKEYFILETOCOPYLIST, ""
  3900.     ERROR STFQUIT
  3901.     END IF
  3902. END SUB
  3903.  
  3904. PUBLIC SUB AddToBillboardList (szDll$, idDlg&, szProc$, lTicks&) 
  3905. '** Purpose:
  3906. '** Author:
  3907. '** Arguments:
  3908. '** Returns:
  3909. '**     
  3910. '** NOTE: Argument szProc$ not used -- retained for backward compatibility
  3911. '*************************************************************************
  3912. DIM rc&,i%, Dll$
  3913. %rem
  3914.     if szDll$ = "" then
  3915.     n% = 1
  3916.     elseif idDlg& = 0 then
  3917.     n% = 2
  3918.     elseif szProc$ = "" then
  3919.     n% = 3
  3920.     elseif lTicks& <= 0 then
  3921.     n% = 4
  3922.     else
  3923.     n% = 0
  3924.     end if
  3925.     if n% > 0 then
  3926.     BadArgErr n%, "AddToBillboardList", szDll$+", "+STR$(idDlg&)+", "+szProc$+", "+STR$(lTicks&)
  3927.     end if
  3928. %endrem ''DEBUG
  3929.     Dll$ = FindResourceinDLL (idDlg&, RT_DIALOG)
  3930.     if Dll$ <> "" then
  3931.         IF FAddToBillboardList(Dll$, idDlg&, FNAMEORGDLGPROC$, lTicks&) <> 0 THEN
  3932.               Exit Sub
  3933.         END IF
  3934.     End if
  3935. label1:
  3936.    ErrorMsg SID_ERR_ADDTOBILLBOARDLIST, ""
  3937.    ERROR STFQUIT
  3938.  
  3939. END SUB
  3940.  
  3941. PUBLIC FUNCTION FindResourceinDLL (idDlg&, ResType%) AS STRING
  3942. '** Purpose: Traverses the list of DLLs in SYM_CUIDLL$ until it finds the
  3943. '**                             one that contains the resource
  3944. '** Author:     JMDonohue
  3945. '** Arguments:  id%     Resource id number
  3946. '** Returns:    String containing the DLL name or null string if not found
  3947. '*************************************************************************
  3948.     DIM rc&,i%, Dll$, szDlls$
  3949.     i% = 1
  3950.     szDlls$ = GetSymbolValue(SYM_CUIDLL$)
  3951.     WHILE (TRUE)
  3952.         Dll$ =  Lot_GetNthFieldFromIniString (szDlls$, i%, "") 
  3953.         if Dll$ <> "" then
  3954.            rc& = GetModuleHandle(Dll$) 
  3955.             If rc& <> 0 Then
  3956.                 rc& = FindResource(rc&, idDlg&, ResType%) 
  3957.             End If
  3958.             If rc& <> 0 Then
  3959.                 FindResourceinDLL = Dll$
  3960.                 Exit Function
  3961.             End If
  3962.         else
  3963.             FindResourceinDLL = ""
  3964.             Exit Function
  3965.         end if
  3966.         i% = i% + 1
  3967.    WEND
  3968. END FUNCTION
  3969.  
  3970. PUBLIC SUB AddBlankToBillboardList (lTicks&) 
  3971. '** Purpose:
  3972. '** Author:
  3973. '** Arguments:
  3974. '** Returns:
  3975. '**     
  3976. '*************************************************************************
  3977. %rem
  3978.     if lTicks& <= 0 then
  3979.     BadArgErr 1, "AddBlankToBillboardList", STR$(lTicks&)
  3980.     end if
  3981. %endrem ''DEBUG
  3982.     IF FAddToBillboardList("", 0, "", lTicks&) = 0 THEN
  3983.     'YYYYYYIF FAddToBillboardList(NULL, 0, NULL, lTicks&) = 0 THEN
  3984.     ErrorMsg SID_ERR_ADDBLANKTOBILLBOARDLIST, ""
  3985.     ERROR STFQUIT
  3986.     END IF
  3987. END SUB
  3988.  
  3989. PUBLIC SUB ClearBillboardList 
  3990. '** Purpose:
  3991. '** Author:
  3992. '** Arguments:
  3993. '** Returns:
  3994. '**     
  3995. '*************************************************************************
  3996.     IF FClearBillboardList() = 0 THEN
  3997.     ErrorMsg SID_ERR_CLEARBILLBOARDLIST, ""
  3998.     ERROR STFQUIT
  3999.     END IF
  4000. END SUB
  4001.  
  4002. PUBLIC SUB SetCopyGaugePosition (x%, y%) 
  4003. '** Purpose:
  4004. '** Author:
  4005. '** Arguments:
  4006. '** Returns:
  4007. '**     
  4008. '*************************************************************************
  4009.     DIM xt&, yt&
  4010.  
  4011.     xt& = CLNG ( x% )
  4012.     yt& = CLNG ( y% )
  4013.     ProSetPos xt&, yt&
  4014. END SUB
  4015.  
  4016. PUBLIC SUB QUIT
  4017. '** Purpose:
  4018. '** Author:
  4019. '** Arguments:
  4020. '*************************************************************************
  4021.    DIM sz$
  4022.  
  4023.    sz$ = PopupModalDlg (DB_EXITHISTORY, DB_EXITHISTORY)
  4024.    If sz$ = "OK" Then
  4025.       UIPopAll
  4026.         gEndStatementEncountered% = TRUE      
  4027.       END
  4028.    End If
  4029. END SUB
  4030.  
  4031.  
  4032. '*************************************************************************
  4033. '** FUNCTION Lot_WriteToRiFile(ripath$) AS INTEGER
  4034. '**            
  4035. '** Purpose:   Writes user, company and serial number in 123w.ri file. 
  4036. '** Author:    JYOTI KEDIA
  4037. '** Arguments: None
  4038. '** Returns:   SUCCESS or Failure
  4039. '*************************************************************************
  4040.  
  4041. PUBLIC FUNCTION Lot_WriteToRiFile (ripath$) AS INTEGER
  4042. DIM  uname$, cname$, snum$
  4043.  
  4044.    Lot_WriteToRiFile = TRUE
  4045.  
  4046. '** Removed all checks on length of names mmeth-8/7/95
  4047. '** C Code now truncates strings if they are too long
  4048.    uname$ = GetSymbolValue("NAME")
  4049. 'print uname$,"uname$"
  4050.    cname$ = GetSymbolValue(SYM_COMPANY$)
  4051. 'print cname$,"cname$"
  4052.    snum$  = GetSymbolValue(SYM_SERIALNUM$)
  4053.  
  4054.    IF WriteUserRegistration(ripath$,uname$,cname$,snum$) <> 0 Then
  4055.       Lot_WriteToRiFile = FALSE
  4056.    End If
  4057.  
  4058. END FUNCTION
  4059.  
  4060. '*************************************************************************
  4061. '** FUNCTION Lot_ReadDefaultsfromRi(default_ripath$) AS INTEGER
  4062. '**
  4063. '** Purpose: For standard,Server and node install reads the default user,
  4064. '**          company name and serial number from 123w.ri file. For
  4065. '**            
  4066. '** Author:    JYOTI KEDIA
  4067. '** Arguments: Sets: SYM_NAME$, SYM_COMPANY$, SYM_SERIALNUM$
  4068. '** Returns:   TURE (SUCCESS)  FALSE (FAILURE)
  4069. '*************************************************************************
  4070.  
  4071. PUBLIC FUNCTION Lot_ReadDefaultsfromRi (default_ripath$) AS INTEGER
  4072. DIM rc%, lrc&, n%
  4073.  
  4074.    DIM buf1 AS STRING : buf1 = CreateBuffer(82)   '* These strings can be upto  80
  4075.    DIM buf2 AS STRING : buf2 = CreateBuffer(82)   '* bytes not including terminator.
  4076.    DIM buf3 AS STRING : buf3 = CreateBuffer(18)   '* See lcomstf\userreg.cpp &
  4077.                           '* callback.lss:WELCOMECB
  4078.  
  4079.    Lot_ReadDefaultsfromRi = FALSE
  4080.  
  4081.    lrc& = DoesFileExist(default_ripath$,femExists)
  4082.    if lrc& = 0 goto rinotfound
  4083.  
  4084.  
  4085.    lrc& = ReadUserRegistration(default_ripath$,buf1,buf2,buf3)
  4086.    If lrc& <> 0 goto rinotfound
  4087.  
  4088.    n% = LEN(buf1)
  4089.    SetSymbolValue SYM_NAME$, LEFT$(buf1, n%)
  4090.    n% = LEN(buf2)
  4091.    SetSymbolValue SYM_COMPANY$, LEFT$(buf2, n%)
  4092.    n% = LEN(buf3)
  4093.    SetSymbolValue SYM_SERIALNUM$, LEFT$(buf3, n%)
  4094.  
  4095.    Lot_ReadDefaultsfromRi = TRUE
  4096.  
  4097.    EXIT FUNCTION
  4098.  
  4099. rinotfound: 
  4100.    
  4101. END FUNCTION
  4102.  
  4103.  
  4104. PUBLIC FUNCTION Lot_GetCurrentProduct() AS INTEGER
  4105. '** Purpose:    This function will return the current product number
  4106. '** Parameters: 
  4107. '** Return:     Product number
  4108. '*************************************************************************
  4109.    Lot_GetCurrentProduct = gCurrentProduct%
  4110. END FUNCTION
  4111.  
  4112. PUBLIC SUB Lot_SetCurrentProduct(ProdNo%) 
  4113. '** Purpose:    Set the current product number
  4114. '** Parameters: ProdNo%  the product number
  4115. '*************************************************************************
  4116.    IF ProdNo% > gMaxNumOfProds% THEN
  4117. '      ERROR STFSETERROR
  4118.       ERROR STFQUIT
  4119.    END IF
  4120.    gCurrentProduct% = ProdNo%
  4121. END SUB
  4122.  
  4123. PUBLIC FUNCTION Lot_GetInstallDir() AS STRING
  4124. '** Purpose:    Return the directory where Install will be installed.
  4125. '** Parameters: 
  4126. '** Return:     Install dir
  4127. '*************************************************************************
  4128.    DIM s$, network$
  4129.     STATIC iniDir$    
  4130.  
  4131.     'Save initial value since it may change over course of install
  4132.     IF iniDir$ = "" THEN
  4133.         s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4134.         network$ = GetSymbolValue(SYM_NETWORK$)
  4135.         IF network$ <> gNODE THEN
  4136.             IF s$ = gSMARTSUITE$ THEN
  4137.                 iniDir$ = GetSymbolValue(SYM_BASEDIR$)
  4138.             ELSE
  4139.                 s$ = Reg_GetDirSymbolList(1)     '** First product dir list
  4140.                 s$ = GetListItem(s$,1)           '** First directory symbol
  4141.                 iniDir$ = GetSymbolValue(s$)
  4142.             END IF
  4143.         ELSE
  4144.             iniDir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4145.         END IF
  4146.     END IF
  4147.     Lot_GetInstallDir = iniDir$
  4148.  
  4149. END FUNCTION
  4150.  
  4151. '** FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  4152. '**            
  4153. '** Purpose:   Retrieve the read 123 directory
  4154. '** Author:    JYOTI KEDIA
  4155. '** Arguments: None
  4156. '** Returns:   The 123 directory (with trailing backslash)
  4157. '*************************************************************************
  4158.  
  4159. PUBLIC FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  4160.    DIM sym$, prodsym$, progdir$, basedir$, l%, m%, disks$, dlen%
  4161.    
  4162.    If GetSymbolValue(SYM_NETWORK$) <> gNODE$ Then
  4163.       sym$ = Reg_GetDirSymbolList(prodno%)
  4164.       prodsym$ = GetListItem(sym$, 1)
  4165.       progdir$ = GetListItem(prodsym$,1)
  4166.    Else
  4167.       If GetSymbolValue (SYM_SINGLESMARTSUITE) =  gSINGLE$ Then
  4168.     disks$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4169.     dlen% = LEN(disks$)
  4170.     If dlen% <=0 Then
  4171.        disks$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4172.        dlen% = LEN(disks$)
  4173.      End If
  4174.     If MID$(disks$,dlen%,1) <> "\" Then
  4175.        disks$ = disks$ + "\"
  4176.     End If
  4177.     progdir$ = disks$
  4178.       Else
  4179.     '** USE THE product dir symbol, to extrapolate what
  4180.     '** the directory is on the server.
  4181.  
  4182. ''**** MMETH ???  STILL NEEDS WORK!
  4183. ''**** MMETH ???  I don't think SYMBASEDIR is always correct!
  4184.  
  4185.     sym$ = Reg_GetDirSymbolList(prodno%)
  4186.     prodsym$ = GetListItem(sym$, 1)
  4187.     progdir$ = GetListItem(prodsym$,1)
  4188.     basedir$ = GetSymbolValue (SYM_BASEDIR$)
  4189.     l% = INSTR(progdir$, basedir$)
  4190.     
  4191.     l% = INSTR(l%, progdir$, "\")
  4192.     m% = INSTR(l%, progdir$, "\")
  4193.  
  4194.     progdir$ = GetSymbolValue (SYM_INSTALL_SOURCE) +_
  4195.            RIGHT$( LEFT$ (progdir$, m%), l%)
  4196.            
  4197.       End If
  4198.    End If
  4199.  
  4200.    Lot_GetTheRealProdDir = progdir$
  4201.  
  4202. END FUNCTION
  4203.  
  4204.  
  4205. '*************************************************************************
  4206. '** FUNCTION Lot_ReadSerialNumber () AS INTEGER
  4207. '**
  4208. '** Purpose:   Reads serial number from SN.DAT and sets the symbol SERIALNUM.
  4209. '** Author:    JYOTI KEDIA
  4210. '** Arguments: None
  4211. '** Returns:   SUCCESS or FAILURE
  4212. '*************************************************************************
  4213.  
  4214. PUBLIC FUNCTION Lot_ReadSerialNumber () AS INTEGER
  4215.  
  4216.    DIM buf1 AS STRING : buf1 = CreateBuffer(18)
  4217.    DIM snpath$, rc&
  4218.  
  4219.    snpath$ = GetSymbolValue(SYM_STF_CWDDIR$)
  4220.    rc& = ReadSerialNumber(snpath$,buf1$)
  4221.    If rc& = 0 Then
  4222.       SetSymbolValue SYM_SERIALNUM$, NullTrim(buf1$)
  4223.       Lot_ReadSerialNumber = SUCCESS
  4224.    Else
  4225.       ErrorMsg SID_ERR_READSERIAL, ""
  4226.       Lot_ReadSerialNumber = FAILURE
  4227.    end if 
  4228.  
  4229. END FUNCTION
  4230.  
  4231. '*************************************************************************
  4232. '** PUBLIC FUNCTION Lot_TrimEndSlash (path$) AS STRING
  4233. '**
  4234. '** Purpose:   trims 
  4235. '** Author:    MMETH
  4236. '** Arguments: path$
  4237. '** Returns:   the modified path
  4238. '*************************************************************************
  4239.  
  4240. PUBLIC FUNCTION Lot_TrimEndSlash (path$) AS STRING
  4241.  
  4242.    DIM l%
  4243.  
  4244.    l% = LEN(path$)
  4245.    If l% <> 0 THEN
  4246.       If MID$(path$, l%, 1) = "\" Then
  4247.     Lot_TrimEndSlash = LEFT$ (path$, l%-1)
  4248.       Else
  4249.     Lot_TrimEndSlash = path$
  4250.       End If
  4251.    End If
  4252.  
  4253. END FUNCTION
  4254.  
  4255. PUBLIC FUNCTION Lot_AreShareToolsSupported () AS INTEGER
  4256. '** Purpose:    Finds if any of the registered products supports share
  4257. '** Author:     MZ
  4258. '** Arguments:  None
  4259. '** Returns:    1 if there is at least one product that supports share
  4260. '**             0 if none of the registered prods supports share or if 
  4261. '**             no products are registered
  4262. '*************************************************************************
  4263.    DIM NumberOfProducts%,count%,ShareSupport%
  4264.    DIM network$, prod$
  4265.  
  4266.    network$ = GetSymbolValue(SYM_NETWORK$)
  4267.    ShareSupport%=0
  4268.    ' Find how many products are registered
  4269.    NumberOfProducts%=Reg_GetNumberOfProducts()
  4270.    IF(NumberOfProducts%<>0) THEN
  4271.       ' Loop through the products
  4272.       FOR count%=1 TO NumberOfProducts%
  4273.      IF Reg_GetProdSupportForShare(count%)=1 THEN
  4274.                 prod$ = Reg_GetProductAcronym(count%)
  4275.             IF network$ = gNODE$  THEN
  4276.                 If  prod$ <> "SUIT" THEN
  4277.                     prod$ = prod$ + gTOP$
  4278.                     If Lot_IsTheFeatureInstalled (prod$) = 1 Then
  4279.                     ShareSupport%=1
  4280.                     EXIT FOR
  4281.                     End If
  4282.                 End If
  4283.             ELSE
  4284.             ShareSupport%=1
  4285.             EXIT FOR
  4286.             END IF    
  4287.      END IF
  4288.       NEXT
  4289.    END IF
  4290.    Lot_AreShareToolsSupported=ShareSupport%
  4291. END FUNCTION
  4292.  
  4293. PUBLIC FUNCTION Lot_AreShare32ToolsSupported () AS INTEGER
  4294. '** Purpose:    Finds if any of the registered products supports share32
  4295. '** Author:     MZ
  4296. '** Arguments:  None
  4297. '** Returns:    1 if there is at least one product that supports share32
  4298. '**             0 if none of the registered prods supports share32 or if 
  4299. '**             no products are registered
  4300. '*************************************************************************
  4301.    DIM NumberOfProducts%,count%,Share32Support%
  4302.  
  4303.    Share32Support%=0
  4304.    ' Find how many products are registered
  4305.    NumberOfProducts%=Reg_GetNumberOfProducts()
  4306.    IF(NumberOfProducts%<>0) THEN
  4307.       ' Loop through the products
  4308.       FOR count%=1 TO NumberOfProducts%
  4309.      IF Reg_GetProdSupportForShare32(count%)=1 THEN
  4310.         Share32Support%=1
  4311.         EXIT FOR
  4312.      END IF
  4313.       NEXT
  4314.    END IF
  4315.    Lot_AreShare32ToolsSupported=Share32Support%
  4316. END FUNCTION
  4317.  
  4318. PUBLIC Lot_CallShareExec_RC%
  4319. PUBLIC FUNCTION Lot_CallSharedTool (func$) AS INTEGER
  4320. '** Purpose:    Simply calls a shared function through EXECUTE
  4321. '**             if share is loaded.  Using EXECUTE allows us to
  4322. '**             not load SHARE.LSS
  4323. '** Author:     MMETH
  4324. '** Arguments:  func$ the function to call.
  4325. '** Returns:    Whatever the function returns.
  4326. '**             
  4327. '*************************************************************************
  4328. DIM notused%
  4329.    Lot_CallSharedTool = 0
  4330.    IF Lot_AreShareToolsSupported () = 1 OR _
  4331.       Lot_AreShare32ToolsSupported () = 1 THEN
  4332.       'notused% = DOEXEC (("SHARE"), (prodcall$))
  4333.       gEndStatementEncountered% = FALSE
  4334.       EXECUTE(|USE "SHARE": sub initialize: Lot_CallShareExec_RC% =| & func$ & |:end sub|)
  4335.       'EXECUTE(|USE "SHARE" : Lot_CallShareExec_RC% = | & func$)
  4336.  
  4337.       '  this gEndStatementEncountered flag is necessary because the Lotus
  4338.       '  END statement, which normally exists the entire program, only
  4339.       '  exits the top-level routine running in DOEXEC.  So,
  4340.       '  check this flag here, to see if we hit an END during DOEXEC.
  4341.  
  4342.       IF gEndStatementEncountered% = TRUE THEN
  4343.      END                       ' exit the program
  4344.       END IF
  4345.  
  4346.       Lot_CallSharedTool = Lot_CallShareExec_RC%
  4347.    END IF
  4348.  
  4349. END FUNCTION
  4350.  
  4351.  
  4352. PUBLIC SUB SetRestartDir (szDir$) 
  4353. '** Purpose:
  4354. '** Author:
  4355. '** Arguments:
  4356. '** Returns:
  4357. '**     
  4358. '*************************************************************************
  4359.     ' This part doesn't really work any way.
  4360.     IF FSetRestartDir(szDir$) = FALSE THEN
  4361.     ErrorMsg SID_ERR_SETRESTARTDIR, ""
  4362.     ERROR STFQUIT
  4363.     END IF
  4364.  
  4365. END SUB
  4366.  
  4367. PUBLIC FUNCTION RestartListEmpty  AS INTEGER
  4368. '** Purpose:
  4369. '** Author:
  4370. '** Arguments:
  4371. '** Returns:
  4372. '**     
  4373. '*************************************************************************
  4374.  
  4375.     IF CInt(FRestartListEmpty()) = FALSE THEN
  4376.     RestartListEmpty = FALSE
  4377.     ELSE
  4378.     RestartListEmpty = TRUE
  4379.     END IF
  4380.  
  4381. END FUNCTION
  4382.  
  4383. PUBLIC FUNCTION ExitExecRestart  AS INTEGER
  4384. '** Purpose:
  4385. '** Author:
  4386. '** Arguments:
  4387. '** Returns:
  4388. '**     
  4389. '*************************************************************************
  4390.  
  4391.     ExitExecRestart = CInt(FExitExecRestart())
  4392.  
  4393. END FUNCTION
  4394.  
  4395.  
  4396. '** FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  4397. '**            
  4398. '** Purpose:   THis function will return the location of the destdir
  4399. '**            for the section, if the feature is installed.
  4400. '**            This function should **NOT** be used before PostCopyConfig.
  4401. '**            In a node situation it can be used during PreCopyConfig for
  4402. '**            shared components ** only! **
  4403. '**            This function can be used for standard, node, and server. Later
  4404. '**            will provide directory suuport on CDs also. Clients should use this function
  4405. '**            heavily! Make sure to check for empty string return "".
  4406. '**
  4407. '**            This function assumes: 
  4408. '**            1. The feature you are looking for exists in the INF file
  4409. '**                 if it doesn't, then we will always report back "" since
  4410. '**                 we depend upon the inf to find the destination directory
  4411. '**            2. The location of the feature relative to the top level
  4412. '**               product directory is identical for server and node!
  4413. '**            
  4414. '**            3. all files that can be found on the server using this
  4415. '**               functions must reside somewher under the main product directory
  4416. '**
  4417. '**            If clients use this function heavily, the transition to CD's
  4418. '**            and Toolkit supported node options will be smooth.
  4419. '**
  4420. '** Author:    MARCEL METH
  4421. '**
  4422. '** Arguments:    prodno%: The product that we are looking for.
  4423. '**            FeatureId$: which is the name of the keyword ID as it appears
  4424. '**                        in the INF FILE.
  4425. '**        filetolookfor$: a file in this section that we can use to
  4426. '**                        confirm that we found the feature.
  4427. '** Returns:   returns the directory where the feature can be found or ""
  4428. '**            If it can't be found.
  4429. '*************************************************************************
  4430. PUBLIC FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  4431.    DIM network$, dirsym$, chpt$, destdir$,s$,subdir$,installIniFile$
  4432.    
  4433.    network$ = GetSymbolValue(SYM_NETWORK$)
  4434.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4435.  
  4436.    '***Processing Suit
  4437.    '******************
  4438.    IF s$ = gSMARTSUITE$ THEN
  4439.  
  4440.       '***Processing Suit Standard
  4441.       IF network$ = gSTANDARD$ THEN
  4442.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4443.      '***Get the chapter
  4444.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4445.      IF chpt$ = "" GOTO NOFEATURE
  4446.      '***Get if the feature was installed
  4447. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4448. ' list
  4449. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4450. '     IF InorOut%=0 GOTO MAYBESUITCD
  4451.      '***Get the destination symbol
  4452.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4453.      IF dirsym$ = "" GOTO NOFEATURE
  4454.      '***Get the destination directory
  4455.      destdir$ = GetSymbolValue(dirsym$)
  4456.      IF destdir$ = "" GOTO NOFEATURE
  4457.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESUITCD
  4458.      '***Get the destination of the feature
  4459.      Lot_WhereIsFeature = destdir$
  4460.      EXIT FUNCTION
  4461.  
  4462.  
  4463.       '***Processing Suit Node
  4464.       ELSEIF network$ = gNODE$ THEN
  4465.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4466.      '***Get the chapter
  4467.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4468.      '***Look on the node
  4469.      IF chpt$ <> "" THEN
  4470.         '***Get if the feature was installed
  4471. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4472. ' list
  4473. '        InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4474. '        IF InorOut%=0 GOTO LOOKONSUITSRV
  4475.         '***Get the destination directory
  4476.         dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4477.         destdir$ = GetSymbolValue(dirsym$)
  4478.         IF DoesFileExist(destdir$+filetolookfor$,femExists) <> 0 THEN 
  4479.            '***Returns the destination of the feature
  4480.            Lot_WhereIsFeature = destdir$
  4481.            EXIT FUNCTION
  4482.         ELSE 
  4483.            GOTO LOOKONSUITSRV
  4484.         END IF
  4485.      ELSE 
  4486.         GOTO LOOKONSUITSRV
  4487.      END IF
  4488.  
  4489.  
  4490.       '***Processing Suit Server
  4491.       ELSEIF network$ = gSERVER$ THEN
  4492.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4493.      '***Get the chapter
  4494.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4495.      IF chpt$ = "" GOTO MAYBESUITCD
  4496.      '***Get if the feature was installed
  4497. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4498. ' list
  4499. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4500. '     IF InorOut%=0 GOTO MAYBESUITCD
  4501.      '***Get the destination symbol
  4502.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4503.      IF dirsym$ = "" GOTO MAYBESUITCD
  4504.      '***Get the destination directory
  4505.      destdir$ = GetSymbolValue(dirsym$)
  4506.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESUITCD
  4507.      '***Get the destination of the feature
  4508.      Lot_WhereIsFeature = destdir$
  4509.      EXIT FUNCTION
  4510.  
  4511.  
  4512.       '***Processing Suit Distribution
  4513.       ELSE  
  4514.      GOTO NOFEATURE
  4515.       END IF
  4516.  
  4517.    '***Processing Single product
  4518.    '****************************
  4519.    ELSEIF s$ = gSINGLE$ THEN
  4520.  
  4521.       '***Processing Single Product Standard
  4522.       IF network$ = gSTANDARD$ THEN
  4523.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4524.      '***Get the chapter
  4525.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4526.      IF chpt$ = "" GOTO NOFEATURE
  4527.      '***Get if the feature was installed
  4528. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4529. ' list
  4530. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4531. '     IF InorOut%=0 GOTO MAYBESINGLECD
  4532.      '***Get the destination symbol
  4533.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4534.      IF dirsym$ = "" GOTO NOFEATURE
  4535.      '***Get the destination directory
  4536.      destdir$ = GetSymbolValue(dirsym$)
  4537.      IF destdir$ = "" GOTO NOFEATURE
  4538.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESINGLECD
  4539.      '***Get the destination of the feature
  4540.      Lot_WhereIsFeature = destdir$
  4541.      EXIT FUNCTION
  4542.  
  4543.       '***Processing Single Product Node
  4544.       ELSEIF network$ = gNODE$ THEN
  4545.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4546.      '***Get the chapter
  4547.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4548.      '***Look on the node
  4549.      IF chpt$ <> "" THEN
  4550.         '***Get if the feature was installed
  4551. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4552. ' list
  4553. '        InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4554. '        IF InorOut%=0 GOTO LOOKONSINGLESRV
  4555.         '***Get the destination directory
  4556.         dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4557.         destdir$ = GetSymbolValue(dirsym$)
  4558.         IF DoesFileExist(destdir$+filetolookfor$,femExists) <> 0 THEN 
  4559.            '***Returns the destination of the feature
  4560.            Lot_WhereIsFeature = destdir$
  4561.            EXIT FUNCTION
  4562.         ELSE 
  4563.            GOTO LOOKONSINGLESRV
  4564.         END IF
  4565.      ELSE 
  4566.         GOTO LOOKONSINGLESRV
  4567.      END IF
  4568.  
  4569.        '***Processing Single Product Server
  4570.       ELSEIF network$ = gSERVER$ THEN
  4571.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4572.      '***Get the chapter
  4573.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4574.      IF chpt$ = "" GOTO MAYBESINGLECD
  4575.      '***Get if the feature was installed
  4576. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4577. ' list
  4578. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4579. '     IF InorOut%=0 GOTO MAYBESINGLECD
  4580.      '***Get the destination symbol
  4581.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4582.      IF dirsym$ = "" GOTO MAYBESINGLECD
  4583.      '***Get the destination directory
  4584.      destdir$ = GetSymbolValue(dirsym$)
  4585.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESINGLECD
  4586.      '***Get the destination of the feature
  4587.      Lot_WhereIsFeature = destdir$
  4588.      EXIT FUNCTION
  4589.  
  4590.       '***Processing Single Product Distribution
  4591.       ELSE  
  4592.      GOTO NOFEATURE
  4593.       END IF
  4594.    END IF
  4595.  
  4596.  
  4597.    Exit Function
  4598.    LOOKONSINGLESRV:
  4599.       destdir$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4600.       IF destdir$ = ""  THEN  destdir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4601.       IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO LOOKONNETCOMPONENT
  4602.       Lot_WhereIsFeature = destdir$
  4603.       EXIT FUNCTION
  4604.  
  4605.    LOOKONSUITSRV:
  4606.       destdir$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4607.       IF destdir$ = ""  THEN  destdir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4608.       installIniFile$ = MakePath(destdir$,gINSTALLINI$)
  4609.       subdir$ = GetIniKeyString(installIniFile$,"Destination Directories", Reg_GetProductAcronym(prodno%))
  4610.       IF DoesFileExist(destdir$+subdir$+filetolookfor$,femExists) = 0 GOTO LOOKONNETCOMPONENT
  4611.       Lot_WhereIsFeature = destdir$+subdir$
  4612.       EXIT FUNCTION
  4613.  
  4614.    LOOKONNETCOMPONENT:
  4615.       destdir$ = GetSymbolValue(SYM_NETCOMPONENT$)
  4616.       IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO NOFEATURE
  4617.       Lot_WhereIsFeature = destdir$
  4618.       EXIT FUNCTION
  4619.  
  4620.    MAYBESINGLECD:
  4621.       ''** MMETH WORK TO DO FOR CD; have a CDROOT symbol
  4622.    MAYBESUITCD:
  4623.       ''** MMETH WORK TO DO FOR CD; have a CDROOT symbol
  4624.  
  4625.    NOFEATURE:        
  4626.       Lot_WhereIsFeature = ""
  4627.  
  4628. END FUNCTION
  4629.  
  4630.  
  4631. PUBLIC FUNCTION Lot_IsTheFeatureInstalled(FeatureToFind$) AS INTEGER
  4632. '** Purpose:   Reads the chapters installed by the network  administrator 
  4633. '**            during server install into install.ini in the section
  4634. '**            [Server Feature Installed] and if the feature 
  4635. '**            was installed  returns 1 if not returns 0
  4636. '** Author:    MZ
  4637. '** Arguments: featureToFind$
  4638. '** Returns:   1 YES
  4639. '**            0 NO
  4640. '*************************************************************************
  4641.    DIM NetworkIns$ 
  4642.  
  4643.    'Identify if I am in node or server install
  4644.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4645.  
  4646.    PopulateCINSTALLLIST
  4647.  
  4648.    IF NetworkIns$ <> gDISTRIBUTION THEN
  4649.  
  4650.       If ISELEMENT(CINSTALL(FeatureToFind$)) <> FALSE Then
  4651.      Lot_IsTheFeatureInstalled = 1
  4652.       Else
  4653.      Lot_IsTheFeatureInstalled = 0
  4654.       End If
  4655.    Else
  4656.       Lot_IsTheFeatureInstalled = 0
  4657.    End If
  4658.  END FUNCTION
  4659.  
  4660. PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstallIni() AS INTEGER
  4661. '** Purpose:   Saves the Features installed by the network  administrator 
  4662. '**            during server install into install.ini in the section
  4663. '**            [Server Feature Installed];  This is needed at Node
  4664. '**            install time
  4665. '**            MMETH added: Also save during standard so that
  4666. '**                         we have a record for standard install
  4667. '**            MZ    Added: save [Destination Directories] needed by Node
  4668. '**                         suit install
  4669. '** Author:    MZ
  4670. '** Arguments: None
  4671. '** Returns:   SUCCESS
  4672. '*************************************************************************
  4673.    DIM NetworkIns$, prodDir$, gInstallIniFile$, CurrChpt$, FeatureName$
  4674.    DIM FeatureNum%,s$,AllProdNum%,prodNum%,ProdAcronym$,BaseDir$,symList$
  4675.    DIM prodsym$,progdir$
  4676.    DIM installkind$
  4677.  
  4678.    'Identify if I am in server or standard install
  4679.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4680.    IF NetworkIns$=gSERVER$ OR NetworkIns$=gSTANDARD THEN
  4681.  
  4682.       'Built the path to install.ini
  4683.       prodDir$ = Lot_GetInstallDir()
  4684.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4685.  
  4686.       PopulateCINSTALLLIST
  4687.  
  4688.       'Loop through the chapters and log the features
  4689.      CurrChpt$ = Lot_GetFirst("", F_INOROUT) 
  4690.      WHILE (CurrChpt$ <> "")
  4691.     'Log all installed chapters
  4692.     FeatureName$ = Lot_GetChapterValStr(CurrChpt$, F_KEYWORD)
  4693.     If ISELEMENT(CINSTALL(FeatureName$)) = FALSE Then
  4694.        FeatureNum% = gNCINSTALL%    'Lot_GetLastFeatureNumber()
  4695.        CreateIniKeyValue gInstallIniFile$, "Server Feature Installed", "Feature"+LTRIM$(STR$(FeatureNum%+1)),FeatureName$, cmoOverwrite
  4696.        CINSTALL (FeatureName$) = "1"
  4697.        gNCINSTALL% = gNCINSTALL%+1
  4698.     END IF
  4699.     CurrChpt$ = Lot_GetNext() 
  4700.      WEND       
  4701.  
  4702.    END IF
  4703.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4704.  
  4705.    'Identify if I am in server and suit install
  4706.     IF NetworkIns$=gSERVER$ AND s$ = gSMARTSUITE$ THEN
  4707.       'Loop through the products and log the directories
  4708.         AllProdNum% = 0
  4709.         AllProdNum% = Reg_GetNumberOfProducts()
  4710.         IF AllProdNum% <> 0 THEN
  4711.             BaseDir$= GetSymbolValue(SYM_BASEDIR$)
  4712.             FOR prodNum%=1 TO AllProdNum%
  4713.                 ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  4714.                 'Get the directory symbol
  4715.                 symList$ = Reg_GetDirSymbolList(prodNum%)
  4716.                 prodsym$ = GetListItem(symList$, 1)
  4717.                 progdir$ = GetListItem(prodsym$,1)
  4718.                 IF LEN(BaseDir$) < LEN(progdir$) THEN
  4719.                     CreateIniKeyValue gInstallIniFile$, "Destination Directories", ProdAcronym$,MID(progdir$,LEN(BaseDir$)+1), cmoOverwrite
  4720.                 END IF
  4721.             NEXT
  4722.       END IF
  4723.  
  4724.    END IF
  4725.  
  4726.    installkind$ = GetSymbolValue(SYM_INSTALLKIND$)
  4727.     'If we're a server, always write directories
  4728.     'Otherwise, write only if NOT a language install so that uninstall can work
  4729.     'correctly on the primary language
  4730.     IF NetworkIns$ = gSERVER$ OR installkind$ <> gLANGUAGEINSTALL$ THEN
  4731.    'write all destination symbols and their values
  4732.    Lot_WriteDestinationSymAndVal gInstallIniFile$, "Destination Symbols And Values" 
  4733.    Lot_WriteCriticalDirectories gInstallIniFile$
  4734.    IF GetSymbolValue(SYM_BASEDIR$) <>"" THEN
  4735.       CreateIniKeyValue gInstallIniFile$, _
  4736.             "Destination Symbols And Values", _
  4737.             "ParentDir",GetSymbolValue(SYM_BASEDIR$),_
  4738.             cmoOverwrite
  4739.    ELSE
  4740.       CreateIniKeyValue gInstallIniFile$, _
  4741.             "Destination Symbols And Values", _
  4742.             "ParentDir","", cmoOverwrite
  4743.    END IF
  4744.    END IF
  4745.  
  4746.    Lot_SaveFeaturesInstaledInInstallIni = SUCCESS
  4747. END FUNCTION
  4748.  
  4749. '*************************************************************************
  4750.  
  4751. PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstNodeIni() AS INTEGER
  4752. '** Purpose:   Saves the Features installed by the network  administrator 
  4753. '**            during server install into install.ini in the section
  4754. '**            [Server Feature Installed];  This is needed at Node
  4755. '**            install time
  4756. '**            MMETH added: Also save during standard so that
  4757. '**                         we have a record for standard install
  4758. '**            MZ    Added: save [Destination Directories] needed by Node
  4759. '**                         suit install
  4760. '** Author:    TV
  4761. '** Arguments: None
  4762. '** Returns:   SUCCESS
  4763. '*************************************************************************
  4764.    DIM NetworkIns$, prodDir$, gInstNodeIniFile$, CurrChpt$, FeatureName$
  4765.    DIM FeatureNum%,s$,AllProdNum%,prodNum%,ProdAcronym$,BaseDir$,symList$
  4766.    DIM prodsym$,progdir$, dirSym$, inidir$
  4767.  
  4768.    'Identify if I am in server or standard install
  4769.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4770.    IF NetworkIns$=gNODE THEN
  4771.       'Built the path to cinstnod.ini
  4772.     dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  4773.     IF GetListLength(dirSym$) >= 1 THEN
  4774.         dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  4775.         inidir$ = GetSymbolValue(dirSym$) 
  4776.               gInstNodeIniFile$ = MakePath(inidir$,"cinstnod.ini")
  4777.     END IF
  4778.  
  4779.  
  4780.       PopulateCINSTNODELIST
  4781.  
  4782.       'Loop through the chapters and log the features
  4783.      CurrChpt$ = Lot_GetFirst("", F_INOROUT) 
  4784.      WHILE (CurrChpt$ <> "")
  4785.     'Log all installed chapters
  4786.     FeatureName$ = Lot_GetChapterValStr(CurrChpt$, F_KEYWORD)
  4787.     If ISELEMENT(CINSTNODE(FeatureName$)) = FALSE Then
  4788.        FeatureNum% = gNCINSTNODE%    'Lot_GetLastFeatureNumber()
  4789.        CreateIniKeyValue gInstNodeIniFile$, "Server Feature Installed", "Feature"+LTRIM$(STR$(FeatureNum%+1)),FeatureName$, cmoOverwrite
  4790.        CINSTNODE (FeatureName$) = "1"
  4791.        gNCINSTNODE% = gNCINSTNODE%+1
  4792.     END IF
  4793.     CurrChpt$ = Lot_GetNext() 
  4794.      WEND       
  4795.  
  4796.    END IF
  4797.    's$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4798.  
  4799.  
  4800.    'write all destination symbols and their values
  4801.    Lot_WriteDestinationSymAndVal gInstNodeIniFile$, "Destination Symbols And Values" 
  4802.    Lot_WriteCriticalDirectories gInstNodeIniFile$
  4803.    IF GetSymbolValue(SYM_BASEDIR$) <>"" THEN
  4804.       CreateIniKeyValue gInstNodeIniFile$, _
  4805.             "Destination Symbols And Values", _
  4806.             "ParentDir",GetSymbolValue(SYM_BASEDIR$),_
  4807.             cmoOverwrite
  4808.    ELSE
  4809.       CreateIniKeyValue gInstNodeIniFile$, _
  4810.             "Destination Symbols And Values", _
  4811.             "ParentDir","", cmoOverwrite
  4812.    END IF
  4813.  
  4814.    Lot_SaveFeaturesInstaledInInstNodeIni = SUCCESS
  4815. END FUNCTION
  4816.  
  4817. '*************************************************************************
  4818.  
  4819. FUNCTION Lot_GetLastFeatureNumber() AS INTEGER
  4820. '** Purpose:   Reads the features installed by the network  administrator 
  4821. '**            so far in the section [Server Feature Installed] and returns 
  4822. '**            the last number
  4823. '** Author:    MZ
  4824. '** Returns:   last number
  4825. '*************************************************************************
  4826.    DIM NetworkIns$, prodDir$, gInstallIniFile$, FeaturePref$
  4827.    DIM FeatureTag$, FeatureID$, rc%, lrc&
  4828.    STATIC FeatureNumber%
  4829.  
  4830.    'Identify if I am in node or server install
  4831.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4832.  
  4833.    IF NetworkIns$=gSERVER$ OR NetworkIns$=gSTANDARD$ THEN
  4834.  
  4835.       'Built the path to install.ini
  4836.       prodDir$ = Lot_GetInstallDir()
  4837.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4838.  
  4839.       FeaturePref$ = "Feature"
  4840.       FeatureNumber%=1
  4841.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  4842.       FeatureID$ = GetIniKeyString(gInstallIniFile$,"Server Feature Installed", FeatureTag$)
  4843. 'print gInstallIniFile$,"Server Feature Installed", FeatureTag$, FeatureID$, "XXX"
  4844.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  4845.       IF lrc& = 1 THEN
  4846.      IF FeatureID$ = "" THEN
  4847.         Lot_GetLastFeatureNumber = 0
  4848.         EXIT FUNCTION
  4849.      ELSE   
  4850.         WHILE (FeatureID$ <> "")
  4851.            FeatureNumber% = FeatureNumber% + 1
  4852.            FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  4853.            FeatureID$ = GetIniKeyString(gInstallIniFile$,"Server Feature Installed", FeatureTag$)
  4854. 'print "in while","Server Feature Installed", FeatureTag$, FeatureID$, "XXX1"
  4855.         WEND
  4856.         Lot_GetLastFeatureNumber = FeatureNumber%-1
  4857. 'print"FeatureNum% in the loop for getLastFeatureNum",STR$(FeatureNumber%)
  4858.         EXIT FUNCTION
  4859.     END IF
  4860.      
  4861.      ELSE
  4862.     '** DND: Look into using ShowPathError here. We should tell the
  4863.     '**      user where we looked for install.ini
  4864.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  4865.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  4866.      END IF
  4867.    END IF
  4868.  END FUNCTION
  4869. '*************************************************************************
  4870.  
  4871. PUBLIC FUNCTION Lot_SaveTheNodeOptionsInInstallIni() AS INTEGER
  4872. '** Purpose:   Saves the node options installed by the network  administrator 
  4873. '**            during server install into install.ini in the section
  4874. '**            [<Product acronym> Node Options];  This is needed at Node
  4875. '**            install time
  4876. '** Author:    MZ
  4877. '** Arguments: None
  4878. '** Returns:   SUCCESS
  4879. '*************************************************************************
  4880.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$
  4881.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  4882.  
  4883.    'Identify if I am in server install
  4884.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4885.    IF NetworkIns$=gSERVER$ THEN
  4886.  
  4887.       'Built the path to install.ini
  4888.       prodDir$ = Lot_GetInstallDir()
  4889.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4890.  
  4891.       'Loop through the products and log the node options
  4892.       AllProdNum% = 0
  4893.       AllProdNum% = Reg_GetNumberOfProducts()
  4894.       IF AllProdNum% <> 0 THEN
  4895.      FOR prodNum%=1 TO AllProdNum%
  4896.         AllOptNum% = 0
  4897.         AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  4898.         IF AllOptNum% <> 0 THEN
  4899.            ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  4900.            'Loop though options
  4901.            FOR OptNum%=1 TO AllOptNum% 
  4902.           IF Reg_IsNodeOptionSelected(prodNum%,OptNum%)=STR(1) THEN
  4903.              OptName$ = Reg_GetNodeOptionStr(prodNum%,OptNum%)
  4904.              IF OptName$ <> "" AND FIsKeywordinCopyList (OptName$) <> FALSE THEN
  4905.             OptCount% = Lot_GetLastNodeOptNumber(ProdAcronym$)
  4906.             CreateIniKeyValue gInstallIniFile$, ProdAcronym$+" Node Options", "Option"+LTRIM$(STR$(OptCount%+1)),OptName$, cmoOverwrite
  4907.              END IF
  4908.           END IF
  4909.            NEXT
  4910.         END IF
  4911.  
  4912.      NEXT
  4913.       END IF
  4914.    END IF
  4915.    Lot_SaveTheNodeOptionsInInstallIni = SUCCESS
  4916. END FUNCTION
  4917. '*************************************************************************
  4918.  
  4919. FUNCTION Lot_GetLastNodeOptNumber(ProdAcronym$) AS INTEGER
  4920. '** Purpose:   Reads the node options installed by the network  administrator 
  4921. '**            so far in the section [<ProdAcronym$>+" Node Options"] and returns 
  4922. '**            the last number
  4923. '** Author:    MZ
  4924. '** Returns:   last number
  4925. '*************************************************************************
  4926.    DIM NetworkIns$, prodDir$, gInstallIniFile$
  4927.    DIM OptTag$, OptID$, OptPref$, lrc&
  4928.    STATIC OptNumber%
  4929.  
  4930.    'Identify if I am in node or server install
  4931.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4932.  
  4933.    IF NetworkIns$=gSERVER$ THEN
  4934.  
  4935.       'Built the path to install.ini
  4936.       prodDir$ = Lot_GetInstallDir()
  4937.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4938.  
  4939.       OptPref$ = "Option"
  4940.       OptNumber%=1
  4941.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  4942.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  4943.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  4944.       IF lrc& = 1 THEN
  4945.      IF OptID$ = "" THEN
  4946.         Lot_GetLastNodeOptNumber = 0
  4947.         EXIT FUNCTION
  4948.      ELSE   
  4949.         WHILE (OptID$ <> "")
  4950.            OptNumber% = OptNumber% + 1
  4951.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  4952.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  4953.         WEND
  4954.         Lot_GetLastNodeOptNumber = OptNumber%-1
  4955.         EXIT FUNCTION
  4956.     END IF
  4957.      
  4958.      ELSE
  4959.     '** DND: Look into using ShowPathError here. We should tell the
  4960.     '**      user where we looked for install.ini
  4961.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  4962.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  4963.      END IF
  4964.    END IF
  4965.  END FUNCTION
  4966. '*************************************************************************
  4967.  
  4968. PUBLIC FUNCTION Lot_IsTheNodeOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  4969. '** Purpose:   Checks if the node options is available to node users
  4970. '**            by reading into install.ini in the section
  4971. '**            [<Product acronym> Node Options]; 
  4972. '** Author:    MZ
  4973. '** Arguments: None
  4974. '** Returns:   1 or 0 if it is or not available
  4975. '*************************************************************************
  4976.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$
  4977.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  4978.  
  4979.    'Identify if I am in node install
  4980.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4981.    IF NetworkIns$=gNODE$ THEN
  4982.  
  4983.       'Built the path to install.ini
  4984.       prodDir$ = Lot_GetInstallDir()
  4985.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4986.       ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  4987.       Lot_IsTheNodeOptionsAvailToNode = 0
  4988.  
  4989.       OptPref$ = "Option"
  4990.       OptNumber%=1
  4991.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  4992.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  4993.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  4994.       IF lrc& = 1 THEN
  4995.      IF OptID$ = OptName$ THEN
  4996.         Lot_IsTheNodeOptionsAvailToNode = 1
  4997.         EXIT FUNCTION
  4998.      ELSE   
  4999.         WHILE (OptID$ <> "")
  5000.            IF OptID$ = OptName$ THEN
  5001.           Lot_IsTheNodeOptionsAvailToNode = 1
  5002.           EXIT FUNCTION
  5003.            END IF
  5004.            OptNumber% = OptNumber% + 1
  5005.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5006.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5007.         WEND
  5008.         Lot_IsTheNodeOptionsAvailToNode = 0
  5009.         EXIT FUNCTION
  5010.     END IF
  5011.      
  5012.      ELSE
  5013.     '** DND: Look into using ShowPathError here. We should tell the
  5014.     '**      user where we looked for install.ini
  5015.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5016.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5017.      END IF
  5018.    END IF
  5019.  END FUNCTION
  5020. '*************************************************************************
  5021.  
  5022. PUBLIC FUNCTION Lot_IsAnyNodeOptAvailToNode() AS INTEGER
  5023. '** Purpose:   Checks if any node options are available to node users
  5024. '**            by reading into install.ini in the section
  5025. '**            [<Product acronym> Node Options]; 
  5026. '** Author:    MZ
  5027. '** Arguments: None
  5028. '** Returns:   1 or 0 if it is or not available
  5029. '*************************************************************************
  5030.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5031.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&, prodNum%
  5032.  
  5033.    'Identify if I am in node install
  5034.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5035.    IF NetworkIns$=gNODE$ THEN
  5036.  
  5037.       'Built the path to install.ini
  5038.       prodDir$ = Lot_GetInstallDir()
  5039.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5040.  
  5041.       'Get all the products registered
  5042.       NumOfProds% = Reg_GetNumberOfProducts()
  5043.       IF NumOfProds% = 0 THEN
  5044.      Lot_IsAnyNodeOptAvailToNode = 0
  5045.      EXIT FUNCTION
  5046.       END IF
  5047.  
  5048.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5049.       IF lrc& = 1 THEN
  5050.      'Loop through the products
  5051.      FOR prodNum% = 1 TO NumOfProds%
  5052.         ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5053.  
  5054.         OptPref$ = "Option"
  5055.         OptNumber%=1
  5056.         OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5057.         OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5058.         IF OptID$ <> "" THEN
  5059.            Lot_IsAnyNodeOptAvailToNode = 1
  5060.            EXIT FUNCTION
  5061.        END IF
  5062.      NEXT 
  5063.      
  5064.       ELSE
  5065.      '** DND: Look into using ShowPathError here. We should tell the
  5066.      '**      user where we looked for install.ini
  5067.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5068.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5069.       END IF
  5070.  
  5071.    END IF
  5072.  END FUNCTION
  5073. '*************************************************************************
  5074.  
  5075. PUBLIC FUNCTION Lot_AreNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  5076. '** Purpose:   Checks if any node options are available to node users
  5077. '**            for the prodNum%, by reading into install.ini in the section
  5078. '**            [<Product acronym> Node Options]; 
  5079. '** Author:    MZ
  5080. '** Arguments: None
  5081. '** Returns:   1 or 0 if it is or not available
  5082. '*************************************************************************
  5083.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5084.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  5085.  
  5086.    'Identify if I am in node install
  5087.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5088.    IF NetworkIns$=gNODE$ THEN
  5089.  
  5090.       'Built the path to install.ini
  5091.       prodDir$ = Lot_GetInstallDir()
  5092.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5093.  
  5094.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5095.       IF lrc& = 1 THEN
  5096.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5097.      OptPref$ = "Option"
  5098.      OptNumber%=1
  5099.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5100.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5101.      IF OptID$ <> "" THEN
  5102.         Lot_AreNodeOptAvailToNodeForProd = 1
  5103.         EXIT FUNCTION
  5104.      ELSE
  5105.         Lot_AreNodeOptAvailToNodeForProd = 0
  5106.         EXIT FUNCTION
  5107.      END IF
  5108.     
  5109.       ELSE
  5110.      '** DND: Look into using ShowPathError here. We should tell the
  5111.      '**      user where we looked for install.ini
  5112.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5113.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5114.       END IF
  5115.  
  5116.    END IF
  5117.  END FUNCTION
  5118. '*************************************************************************
  5119.  
  5120. PUBLIC FUNCTION Lot_GetNumOfNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  5121. '** Purpose:   Counts the node options available to node users
  5122. '**            for the prodNum%, by reading into install.ini in the section
  5123. '**            [<Product acronym> Node Options]; 
  5124. '** Author:    MZ
  5125. '** Arguments: None
  5126. '** Returns:   0 or num of options
  5127. '*************************************************************************
  5128.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfOptions%
  5129.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  5130.  
  5131.    'Identify if I am in node install
  5132.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5133.    IF NetworkIns$=gNODE$ THEN
  5134.  
  5135.       'Built the path to install.ini
  5136.       prodDir$ = Lot_GetInstallDir()
  5137.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5138.  
  5139.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5140.       IF lrc& = 1 THEN
  5141.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5142.      OptPref$ = "Option"
  5143.      OptNumber%=1
  5144.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5145.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5146.      IF OptID$ <> "" THEN
  5147.         WHILE (OptID$ <> "")
  5148.            NumOfOptions% = OptNumber%
  5149.            OptNumber% = OptNumber% + 1
  5150.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5151.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5152.         WEND
  5153.       ELSE
  5154.         Lot_GetNumOfNodeOptAvailToNodeForProd = 0
  5155.         EXIT FUNCTION
  5156.      END IF
  5157.      Lot_GetNumOfNodeOptAvailToNodeForProd = NumOfOptions
  5158.      EXIT FUNCTION
  5159.     
  5160.       ELSE
  5161.      '** DND: Look into using ShowPathError here. We should tell the
  5162.      '**      user where we looked for install.ini
  5163.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5164.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5165.       END IF
  5166.  
  5167.    END IF
  5168.  END FUNCTION
  5169. '*************************************************************************
  5170.  
  5171. PUBLIC FUNCTION Lot_AreAnyNodeOptAvailToSrv() AS INTEGER
  5172. '** Purpose:   Checks the registration database to find the registred 
  5173. '**            node options
  5174. '** Author:    MZ
  5175. '** Arguments: None
  5176. '** Returns:   1 if there is at least 1 option or 0 if there is none
  5177. '*************************************************************************
  5178.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$, j%, nodeopt_flag%
  5179.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5180.    DIM OptKeyword$, chpt$
  5181.  
  5182.    'Identify if I am in server install
  5183.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5184.    IF NetworkIns$=gSERVER$ THEN
  5185.  
  5186.       'Built the path to install.ini
  5187.       prodDir$ = Lot_GetInstallDir()
  5188.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5189.  
  5190.       'Loop through the products and check for node options
  5191.       AllProdNum% = 0
  5192.       nodeopt_flag% = 0
  5193.       AllProdNum% = Reg_GetNumberOfProducts()
  5194.       IF AllProdNum% <> 0 THEN
  5195.      FOR prodNum%=1 TO AllProdNum%
  5196.         AllOptNum% = 0
  5197.         AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  5198.  
  5199. '            Reg_ReSetAllNodeOptsSelToDefaults prodNum%
  5200.         OptNum%=Reg_GetNumofNodeOptions(prodNum%)
  5201.      IF OptNum% <> 0 THEN
  5202.         chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%) + gTOP$)
  5203.        ' Loop through the options
  5204.         FOR j% = 1 TO OptNum%
  5205.         OptKeyWord$ = Reg_GetNodeOptionStr(prodNum%,j%)
  5206.         chpt$ = Lot_GetChapterFromKeyword(OptKeyWord$)
  5207.         IF INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1 THEN
  5208.          nodeopt_flag% = 1
  5209.         END IF
  5210.         NEXT
  5211.      END IF
  5212.      
  5213.      IF AllOptNum% <> 0 AND nodeopt_flag% <> 0 THEN
  5214.            Lot_AreAnyNodeOptAvailToSrv=1
  5215.            EXIT FUNCTION
  5216.         END IF
  5217.      NEXT
  5218.       ELSE
  5219.      Lot_AreAnyNodeOptAvailToSrv=0
  5220.      EXIT FUNCTION
  5221.       END IF
  5222.    ELSE
  5223.       Lot_AreAnyNodeOptAvailToSrv=0
  5224.       EXIT FUNCTION
  5225.    END IF
  5226.  
  5227.    Lot_AreAnyNodeOptAvailToSrv=0
  5228. END FUNCTION
  5229. '*************************************************************************
  5230.  
  5231.  
  5232.  
  5233. PUBLIC FUNCTION Lot_SaveTheCDOptionsInInstallIni() AS INTEGER
  5234. '** Purpose:   Saves the CD options installed by the network  administrator 
  5235. '**            during server install into install.ini in the section
  5236. '**            [<Product acronym> CD Options];  This is needed at CD
  5237. '**            install time
  5238. '** Author:    MZ
  5239. '** Arguments: None
  5240. '** Returns:   SUCCESS
  5241. '*************************************************************************
  5242.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$
  5243.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5244.  
  5245.    'Identify if I am in server install
  5246.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5247.    IF NetworkIns$=gSERVER$ THEN
  5248.  
  5249.       'Built the path to install.ini
  5250.       prodDir$ = Lot_GetInstallDir()
  5251.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5252.  
  5253.       'Loop through the products and log the CD options
  5254.       AllProdNum% = 0
  5255.       AllProdNum% = Reg_GetNumberOfProducts()
  5256.       IF AllProdNum% <> 0 THEN
  5257.      FOR prodNum%=1 TO AllProdNum%
  5258.         AllOptNum% = 0
  5259.         AllOptNum% = Reg_GetNumofCDOptions(prodNum%)
  5260.         IF AllOptNum% <> 0 THEN
  5261.            ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5262.            'Loop though options
  5263.            FOR OptNum%=1 TO AllOptNum% 
  5264.           IF Reg_IsCDOptionSelected(prodNum%,OptNum%)=STR(1) THEN
  5265.              OptName$ = Reg_GetCDOptionStr(prodNum%,OptNum%)
  5266.              IF OptName$ <> "" AND FIsKeywordinCopyList (OptName$) <> FALSE THEN
  5267.             OptCount% = Lot_GetLastCDOptNumber(ProdAcronym$)
  5268.             CreateIniKeyValue gInstallIniFile$, ProdAcronym$+" CD Options", "Option"+LTRIM$(STR$(OptCount%+1)),OptName$, cmoOverwrite
  5269.              END IF
  5270.           END IF
  5271.            NEXT
  5272.         END IF
  5273.  
  5274.      NEXT
  5275.       END IF
  5276.    END IF
  5277.    Lot_SaveTheCDOptionsInInstallIni = SUCCESS
  5278. END FUNCTION
  5279. '*************************************************************************
  5280.  
  5281. FUNCTION Lot_GetLastCDOptNumber(ProdAcronym$) AS INTEGER
  5282. '** Purpose:   Reads the CD options installed by the network  administrator 
  5283. '**            so far in the section [<ProdAcronym$>+" CD Options"] and returns 
  5284. '**            the last number
  5285. '** Author:    MZ
  5286. '** Returns:   last number
  5287. '*************************************************************************
  5288.    DIM NetworkIns$, prodDir$, gInstallIniFile$
  5289.    DIM OptTag$, OptID$, OptPref$, rc%
  5290.    STATIC OptNumber%
  5291.  
  5292.    'Identify if I am in CD or server install
  5293.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5294.  
  5295.    IF NetworkIns$=gSERVER$ THEN
  5296.  
  5297.       'Built the path to install.ini
  5298.       prodDir$ = Lot_GetInstallDir()
  5299.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5300.  
  5301.       OptPref$ = "Option"
  5302.       OptNumber%=1
  5303.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5304.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5305.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5306.      IF OptID$ = "" THEN
  5307.         Lot_GetLastCDOptNumber = 0
  5308.         EXIT FUNCTION
  5309.      ELSE   
  5310.         WHILE (OptID$ <> "")
  5311.            OptNumber% = OptNumber% + 1
  5312.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5313.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5314.         WEND
  5315.         Lot_GetLastCDOptNumber = OptNumber%-1
  5316.         EXIT FUNCTION
  5317.     END IF
  5318.      
  5319.      ELSE
  5320.     '** DND: Look into using ShowPathError here. We should tell the
  5321.     '**      user where we looked for install.ini
  5322.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5323.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5324.      END IF
  5325.    END IF
  5326.  END FUNCTION
  5327. '*************************************************************************
  5328.  
  5329. PUBLIC FUNCTION Lot_IsTheCDOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  5330. '** Purpose:   Checks if the CD options is available to node users
  5331. '**            by reading into install.ini in the section
  5332. '**            [<Product acronym> CD Options]; 
  5333. '** Author:    MZ
  5334. '** Arguments: None
  5335. '** Returns:   1 or 0 if it is or not available
  5336. '*************************************************************************
  5337.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$
  5338.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5339.  
  5340.    'Identify if I am in node install
  5341.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5342.    IF NetworkIns$=gNODE$ THEN
  5343.  
  5344.       'Built the path to install.ini
  5345.       prodDir$ = Lot_GetInstallDir()
  5346.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5347.       ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5348.       Lot_IsTheCDOptionsAvailToNode = 0
  5349.  
  5350.       OptPref$ = "Option"
  5351.       OptNumber%=1
  5352.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5353.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5354.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5355.      IF OptID$ = OptName$ THEN
  5356.         Lot_IsTheCDOptionsAvailToNode = 1
  5357.         EXIT FUNCTION
  5358.      ELSE   
  5359.         WHILE (OptID$ <> "")
  5360.            IF OptID$ = OptName$ THEN
  5361.           Lot_IsTheCDOptionsAvailToNode = 1
  5362.           EXIT FUNCTION
  5363.            END IF
  5364.            OptNumber% = OptNumber% + 1
  5365.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5366.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5367.         WEND
  5368.         Lot_IsTheCDOptionsAvailToNode = 0
  5369.         EXIT FUNCTION
  5370.     END IF
  5371.      
  5372.      ELSE
  5373.     '** DND: Look into using ShowPathError here. We should tell the
  5374.     '**      user where we looked for install.ini
  5375.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5376.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5377.      END IF
  5378.    END IF
  5379.  END FUNCTION
  5380. '*************************************************************************
  5381.  
  5382. PUBLIC FUNCTION Lot_IsAnyCDOptAvailToNode() AS INTEGER
  5383. '** Purpose:   Checks if any CD options are available to node users
  5384. '**            by reading into install.ini in the section
  5385. '**            [<Product acronym> CD Options]; 
  5386. '** Author:    MZ
  5387. '** Arguments: None
  5388. '** Returns:   1 or 0 if it is or not available
  5389. '*************************************************************************
  5390.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5391.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%,prodNum%
  5392.  
  5393.    'Identify if I am in node install
  5394.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5395.    IF NetworkIns$=gNODE$ THEN
  5396.  
  5397.       'Built the path to install.ini
  5398.       prodDir$ = Lot_GetInstallDir()
  5399.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5400.  
  5401.       'Get all the products registered
  5402.       NumOfProds% = Reg_GetNumberOfProducts()
  5403.       IF NumOfProds% = 0 THEN
  5404.      Lot_IsAnyCDOptAvailToNode = 0
  5405.      EXIT FUNCTION
  5406.       END IF
  5407.  
  5408.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5409.      'Loop through the products
  5410.      FOR prodNum% = 1 TO NumOfProds%
  5411.         ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5412.  
  5413.         OptPref$ = "Option"
  5414.         OptNumber%=1
  5415.         OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5416.         OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5417.         IF OptID$ <> "" THEN
  5418.            Lot_IsAnyCDOptAvailToNode = 1
  5419.            EXIT FUNCTION
  5420.        END IF
  5421.      NEXT 
  5422.      
  5423.       ELSE
  5424.      '** DND: Look into using ShowPathError here. We should tell the
  5425.      '**      user where we looked for install.ini
  5426.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5427.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5428.       END IF
  5429.  
  5430.    END IF
  5431.  END FUNCTION
  5432. '*************************************************************************
  5433.  
  5434. PUBLIC FUNCTION Lot_AreCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  5435. '** Purpose:   Checks if any CD options are available to node users
  5436. '**            for the prodNum%, by reading into install.ini in the section
  5437. '**            [<Product acronym> CD Options]; 
  5438. '** Author:    MZ
  5439. '** Arguments: None
  5440. '** Returns:   1 or 0 if it is or not available
  5441. '*************************************************************************
  5442.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5443.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5444.  
  5445.    'Identify if I am in node install
  5446.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5447.    IF NetworkIns$=gNODE$ THEN
  5448.  
  5449.       'Built the path to install.ini
  5450.       prodDir$ = Lot_GetInstallDir()
  5451.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5452.  
  5453.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5454.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5455.      OptPref$ = "Option"
  5456.      OptNumber%=1
  5457.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5458.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5459.      IF OptID$ <> "" THEN
  5460.         Lot_AreCDOptAvailToNodeForProd = 1
  5461.         EXIT FUNCTION
  5462.      ELSE
  5463.         Lot_AreCDOptAvailToNodeForProd = 0
  5464.         EXIT FUNCTION
  5465.      END IF
  5466.     
  5467.       ELSE
  5468.      '** DND: Look into using ShowPathError here. We should tell the
  5469.      '**      user where we looked for install.ini
  5470.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5471.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5472.       END IF
  5473.  
  5474.    END IF
  5475.  END FUNCTION
  5476. '*************************************************************************
  5477.  
  5478. PUBLIC FUNCTION Lot_GetNumOfCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  5479. '** Purpose:   Counts the CD options available to node users
  5480. '**            for the prodNum%, by reading into install.ini in the section
  5481. '**            [<Product acronym> CD Options]; 
  5482. '** Author:    MZ
  5483. '** Arguments: None
  5484. '** Returns:   0 or num of options
  5485. '*************************************************************************
  5486.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfOptions%
  5487.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5488.  
  5489.    'Identify if I am in node install
  5490.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5491.    IF NetworkIns$=gNODE$ THEN
  5492.  
  5493.       'Built the path to install.ini
  5494.       prodDir$ = Lot_GetInstallDir()
  5495.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5496.  
  5497.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5498.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5499.      OptPref$ = "Option"
  5500.      OptNumber%=1
  5501.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5502.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5503.      IF OptID$ <> "" THEN
  5504.         WHILE (OptID$ <> "")
  5505.            NumOfOptions% = OptNumber%
  5506.            OptNumber% = OptNumber% + 1
  5507.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5508.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5509.         WEND
  5510.       ELSE
  5511.         Lot_GetNumOfCDOptAvailToNodeForProd = 0
  5512.         EXIT FUNCTION
  5513.      END IF
  5514.      Lot_GetNumOfCDOptAvailToNodeForProd = NumOfOptions
  5515.      EXIT FUNCTION
  5516.     
  5517.       ELSE
  5518.      '** DND: Look into using ShowPathError here. We should tell the
  5519.      '**      user where we looked for install.ini
  5520.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5521.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5522.       END IF
  5523.  
  5524.    END IF
  5525.  END FUNCTION
  5526. '*************************************************************************
  5527.  
  5528. PUBLIC FUNCTION Lot_AreAnyCDOptAvailToSrv() AS INTEGER
  5529. '** Purpose:   Checks the registration database to find the registred 
  5530. '**            CD options
  5531. '** Author:    MZ
  5532. '** Arguments: None
  5533. '** Returns:   1 if there is at least 1 option or 0 if there is none
  5534. '*************************************************************************
  5535.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$, j%, CDopt_flag%
  5536.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5537.    DIM OptKeyword$, chpt$
  5538.  
  5539.    'Identify if I am in server install
  5540.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5541.    IF NetworkIns$=gSERVER$ THEN
  5542.  
  5543.       'Built the path to install.ini
  5544.       prodDir$ = Lot_GetInstallDir()
  5545.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5546.  
  5547.       'Loop through the products and check for CD options
  5548.       AllProdNum% = 0
  5549.       CDopt_flag% = 0
  5550.       AllProdNum% = Reg_GetNumberOfProducts()
  5551.       IF AllProdNum% <> 0 THEN
  5552.      FOR prodNum%=1 TO AllProdNum%
  5553.         AllOptNum% = 0
  5554.         AllOptNum% = Reg_GetNumofCDOptions(prodNum%)
  5555.  
  5556. '            Reg_ReSetAllCDOptsSelToDefaults prodNum%
  5557.         OptNum%=Reg_GetNumofCDOptions(prodNum%)
  5558.      IF OptNum% <> 0 THEN
  5559.         chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%) + gTOP$)
  5560.        ' Loop through the options
  5561.         FOR j% = 1 TO OptNum%
  5562.         OptKeyWord$ = Reg_GetCDOptionStr(prodNum%,j%)
  5563.         chpt$ = Lot_GetChapterFromKeyword(OptKeyWord$)
  5564.         IF INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1 THEN
  5565.          CDopt_flag% = 1
  5566.         END IF
  5567.         NEXT
  5568.      END IF
  5569.      
  5570.      IF AllOptNum% <> 0 AND CDopt_flag% <> 0 THEN
  5571.            Lot_AreAnyCDOptAvailToSrv=1
  5572.            EXIT FUNCTION
  5573.         END IF
  5574.      NEXT
  5575.       ELSE
  5576.      Lot_AreAnyCDOptAvailToSrv=0
  5577.      EXIT FUNCTION
  5578.       END IF
  5579.    ELSE
  5580.       Lot_AreAnyCDOptAvailToSrv=0
  5581.       EXIT FUNCTION
  5582.    END IF
  5583.  
  5584.    Lot_AreAnyCDOptAvailToSrv=0
  5585. END FUNCTION
  5586. '*************************************************************************
  5587.  
  5588.  
  5589.  
  5590.  
  5591. '*************************************************************************
  5592. '** FUNCTION GetNotesPathfromLotusIni() AS STRING
  5593. '**
  5594. '** Purpose: Gets the notes dir path from Lotus.ini file, and searches for
  5595. '**          notes.exe in the product dir path. 
  5596. '**            
  5597. '** Author:    INSIK RHEE
  5598. '** Arguments: None
  5599. '** Returns:   if notes.exe does not exist in dir specified in lotus.ini, it
  5600. '**            returns "", otherwise returns the full path without filename.
  5601. '*************************************************************************
  5602.  
  5603.  
  5604. PUBLIC FUNCTION GetNotesPathfromLotusIni() AS STRING
  5605. DIM DestDir$, lotusinipath$, defdir$, temp%, ProdDir$, fullpath$, rv%
  5606.  
  5607.    DestDir$ = GetWindowsDir()
  5608.    lotusinipath$ = DestDir$ +"lotus.ini"
  5609.  
  5610.    if DoesFileExist(lotusinipath$,femExists) then
  5611.       defdir$ = GetIniKeyString(lotusinipath$,"Lotus Applications", "Notes")
  5612.       if defdir$ <> "" then
  5613.      temp% = INSTR(1,LCASE$(defdir$),"notes.exe")
  5614.      if temp% <> 0 then
  5615.         ProdDir$ = MID$(defdir$,1,(temp%-1))
  5616.         if ProdDir$ <> "" then
  5617.            fullpath$ = ProdDir$ + "notes.exe"
  5618.            if DoesFileExist(fullpath$, femExists) then
  5619.           GetNotesPathfromLotusIni = MID$(defdir$,1,(temp%-2))
  5620.           EXIT FUNCTION
  5621.            end if 
  5622.         end if 
  5623.      end if 
  5624.       end if 
  5625.    end if
  5626.  
  5627.    GetNotesPathfromLotusIni = ""
  5628.  
  5629. END FUNCTION
  5630.  
  5631. '*************************************************************************
  5632. '** FUNCTION IsNotesInPath AS INTEGER
  5633. '**
  5634. '** Purpose: Detects the presence of notes path in the autoexec.bat file
  5635. '**            
  5636. '** Author:    INSIK RHEE
  5637. '** Arguments: None
  5638. '** Returns:   1 if true, 0 if false.
  5639. '*************************************************************************
  5640.  
  5641. PUBLIC FUNCTION IsNotesInPath() AS INTEGER
  5642. DIM     notesdir$,autoexec$,Buffer$
  5643. DIM autofile%, FoundPath%
  5644.  
  5645.     notesdir$ = GetNotesPathfromLotusIni()
  5646.     IsNotesInPath = 0                                                                       ' default = FALSE
  5647.     if notesdir$ = "" then
  5648.         IsNotesInPath = 1
  5649.         EXIT FUNCTION
  5650.     end if
  5651.     autoexec$ = GetBootDrive() 
  5652.    IF autoexec$ <> "" THEN
  5653.       autoexec$ = autoexec$ + "autoexec.bat" 
  5654.    ELSE
  5655.       autoexec$ = "c:\" + "autoexec.bat"
  5656.    END IF
  5657.  
  5658.    autofile% = 111
  5659.     OPEN autoexec$ FOR INPUT AS autofile%
  5660.     Do Until EOF(autofile%)
  5661.         LINE INPUT #autofile%, Buffer$
  5662.         FoundPath% = INSTR(1,LCASE$(Buffer$), "path")
  5663.         if FoundPath% <> 0 Then                                                 ' path statement found.
  5664.             FoundPath% = INSTR(FoundPath%, LCASE$(Buffer$), LCASE$(notesdir$))
  5665.             if FoundPath% <> 0 Then 
  5666.                 IsNotesInPath = 1
  5667.                 CLOSE #autofile%
  5668.                 EXIT FUNCTION
  5669.             end if
  5670.         end if
  5671.     Loop
  5672.     CLOSE #autofile%
  5673.  
  5674. END FUNCTION
  5675.  
  5676. '*************************************************************************
  5677. '** FUNCTION IsShareInAUTOEXEC AS INTEGER
  5678. '**
  5679. '** Purpose: Detects the presence of SHARE.EXE in the autoexec.bat file
  5680. '**            
  5681. '** Author:    INSIK RHEE
  5682. '** Arguments: None
  5683. '** Returns:   1 if true, 0 if false.
  5684. '*************************************************************************
  5685.  
  5686. PUBLIC FUNCTION IsShareInAUTOEXEC() AS INTEGER
  5687. DIM   autoexec$,Buffer$
  5688. DIM   autofile%, FoundShare%
  5689.  
  5690.     IsShareInAUTOEXEC = 0                                                                   ' default = FALSE
  5691.    autoexec$ = GetBootDrive() 
  5692.    IF autoexec$ <> "" THEN
  5693.       autoexec$ = autoexec$ + "autoexec.bat" 
  5694.    ELSE
  5695.       autoexec$ = "c:\" + "autoexec.bat"
  5696.    END IF
  5697.  
  5698.     autofile% = 111
  5699.     OPEN autoexec$ FOR INPUT AS autofile%
  5700.     Do Until EOF(autofile%)
  5701.         LINE INPUT #autofile%, Buffer$
  5702.         FoundShare% = INSTR(1,LCASE$(Buffer$), "share")
  5703.         if FoundShare% <> 0 Then                                                        ' share statement found.
  5704.             IsShareInAUTOEXEC = 1
  5705.             CLOSE #autofile%
  5706.             EXIT FUNCTION
  5707.         end if
  5708.     Loop
  5709.    CLOSE #autofile%
  5710.  
  5711. END FUNCTION
  5712.  
  5713. '*************************************************************************
  5714. '** FUNCTION ModifyAutoexec AS STRING
  5715. '**
  5716. '** Purpose: Modifies autoexec.bat to include share and/or modify path to 
  5717. '**             include notes 
  5718. '**            
  5719. '** Author:    INSIK RHEE
  5720. '** Arguments:  modflag%        = bitwise flag on what to modify.
  5721. '**                             directmod%      = 1 to modify autoexec.bat (backing up old one)
  5722. '**                                                       0 to modify to a backup file 
  5723. '**                             backup$         = backup filename 
  5724. '** Returns:   NULL string if success.  string describing error otherwise
  5725. '**     NOTE: This function assumes that the caller has already used the 
  5726. '** IsNotesInPath and IsShareEnabled calls and will NOT check to see if 
  5727. '** the modifications are redundant.
  5728. '*************************************************************************
  5729.  
  5730.  
  5731. PUBLIC FUNCTION ModifyAutoexec(modflag%,directmod%,backup$) AS STRING
  5732. DIM     notesdir$,src$,dest$,Buffer$
  5733. DIM srcfile%,destfile%, FoundPath%, PathNext%
  5734.  
  5735.     srcfile% = 112
  5736.     destfile% = 113
  5737.     ModifyAutoexec=""                                                               ' default
  5738.     if (modflag% AND MANotes) then                          ' notes mod
  5739.         notesdir$ = GetNotesPathfromLotusIni()
  5740.     end if
  5741.    src$ = GetBootDrive() 
  5742.    IF src$ <> "" THEN
  5743.       dest$ = src$ + backup$
  5744.       src$ = src$ + "autoexec.bat"
  5745.     ELSE
  5746.       dest$ = "c:\" + backup$
  5747.       src$ = "c:\" + "autoexec.bat"
  5748.    END IF
  5749.  
  5750.     
  5751.     IF Win32CopyFile(src$, dest$, TRUE) = FALSE THEN
  5752.         ModifyAutoexec = LdString( SID_ERR_AUTOEXEC_NOT_COPIED )
  5753.         EXIT FUNCTION
  5754.     End If
  5755.  
  5756.     Win32CopyFile src$, dest$, TRUE
  5757.  
  5758.     if directmod% <> 0 then
  5759.         src$ = dest$
  5760.       dest$ = GetBootDrive()
  5761.       IF dest$ <> "" THEN
  5762.      dest$ = dest$ + "autoexec.bat" 
  5763.       ELSE
  5764.            dest$ = "c:\" + "autoexec.bat"
  5765.       END IF
  5766.    
  5767.     End If
  5768.     OPEN src$ FOR INPUT AS srcfile%
  5769.     OPEN dest$ FOR OUTPUT AS destfile%
  5770.     PathNext% = 0   ' set to 1 when path found, 2 after mod is done.
  5771.     Do Until EOF(srcfile%)
  5772.         LINE INPUT #srcfile%, Buffer$
  5773.         FoundPath% = INSTR(1,LCASE$(Buffer$), "path")
  5774.         if ((FoundPath% <> 0) AND (PathNext <> 2)) Then  ' path statement found.
  5775.             PathNext% = 1
  5776.         end if
  5777.         PRINT #destfile%, Buffer$
  5778.         if PathNext% = 1 Then
  5779.             if (modflag% AND MANotes) then
  5780.                 PRINT #destfile%, "PATH=%PATH%;"+notesdir$
  5781.             End If
  5782.             If (modflag% AND MAShare) then
  5783.                 PRINT #destfile%, "SHARE"
  5784.             End If
  5785.             PathNext% = 2
  5786.         End If
  5787.     Loop
  5788.     if PathNext% <> 2 Then                                                                  ' path statement not found?
  5789.         if (modflag% AND MANotes) then
  5790.             PRINT #destfile%, "PATH=%PATH%;"+notesdir$
  5791.         End If
  5792.         If (modflag% AND MAShare) then
  5793.             PRINT #destfile%, "SHARE"
  5794.         End If
  5795.     End If
  5796.     CLOSE #srcfile%, #destfile%
  5797. END FUNCTION
  5798.  
  5799. '*************************************************************************
  5800. '** FUNCTION GetBootDrive() AS STRING
  5801. '**
  5802. '** Purpose: Gets the boot drive letter and trailing slash (e.g. "C:\")
  5803. '**            
  5804. '** Author:    INSIK RHEE
  5805. '** Arguments: None
  5806. '** Returns:   Searches the fixed drive list for AUTOEXEC.BAT
  5807. '**                        returns null string if none found. (or READ_ONLY drive)
  5808. '*************************************************************************
  5809.  
  5810. PUBLIC FUNCTION GetBootDrive() AS STRING
  5811. DIM lDrive$, Length%, count%
  5812.     GetLocalHardDrivesList SYM_LOCALHARDDRIVES$
  5813.     Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  5814.     FOR count% = 1 TO Length%
  5815.         lDrive$     = GetListItem(SYM_LOCALHARDDRIVES$, count%) + ":\"
  5816.         IF IsDirWritable(lDrive$) AND (DoesFileExist(lDrive$+"autoexec.bat",femExists)=1) THEN
  5817.         GetBootDrive$ = lDrive$
  5818.             EXIT FUNCTION
  5819.         END IF
  5820.     NEXT
  5821.     GetBootDrive$=""
  5822. END FUNCTION
  5823.  
  5824.  
  5825. PUBLIC SUB      DL_SetOraclePath
  5826. '** Purpose:   This subroutine Sets the Oracle Data Path symbol
  5827. '**            
  5828. '** Author:    JMD
  5829. '** Arguments: NONE
  5830. '*************************************************************************
  5831.     DIM TmpDDir$
  5832.     ' Should use this if NODE or STANDARD - 
  5833.     TmpDDir$ = Lot_GetORACLEHomePath() 
  5834.     IF TmpDDir$ <> "" THEN
  5835.        SetSymbolValue SYM_ORACLEHOMEDIR$, TmpDDir$
  5836.          Lot_RefreshDestination(SYM_ORACLEHOMEDIR$)
  5837.     End If
  5838. END SUB
  5839.  
  5840. PUBLIC SUB      DL_SetNotesDataPath
  5841. '** Purpose:   This subroutine Sets the DataLens specific symbols for the
  5842. '**            Notes Data Path.  This facilitates copying NSF files to the 
  5843. '**            proper DOC location
  5844. '** Author:    PJT
  5845. '** Arguments: NONE
  5846. '*************************************************************************
  5847.     DIM TmpDDir$
  5848.     ' Should use this if NODE or STANDARD - 
  5849.     TmpDDir$ = Lot_GetLotusNotesDataPath() 
  5850.     'print "Got Lotus Notes Data Directory of " & TmpDDir$
  5851.     IF TmpDDir$ <> "" THEN
  5852.        SetSymbolValue SYM_LOTUSNOTESDATADIR$, TmpDDir$
  5853.          Lot_RefreshDestination(SYM_LOTUSNOTESDATADIR$)
  5854.     End If
  5855. END SUB
  5856.  
  5857. PUBLIC FUNCTION Lot_GetLotusNotesDataPath() AS STRING
  5858. '** Purpose:         Returns the location for the Notes Data Directory
  5859. '** Author:          PTilton
  5860. '** Arguments:       None.
  5861. '** Returns:             NULL String if Notes Data Directory not found.
  5862. '**                  Otherwise, returns directory of Notes Data Directory.
  5863. '*************************************************************************
  5864.    DIM szDir$, szSearch$, szTmp$, rc%, lrc&
  5865.  
  5866.    Lot_GetLotusNotesDataPath = ""
  5867.    szTmp$ = GetIniKeyString( "Notes.ini", "Notes", "Directory")
  5868.    If szTmp$ <> "" Then
  5869.        lrc& = FDirExists ( szTmp$ )
  5870. '          print "Does Directory -" & szTmp$ & "- Exist: " & str( rc% )
  5871.        If (lrc& = 1) Then
  5872.           Lot_GetLotusNotesDataPath = szTmp$
  5873.        End If
  5874.    Else
  5875.       szTmp$ = GetIniKeyString( "Lotus.ini", "Lotus Applications", "Notes")
  5876.       szSearch$ = ucase$( szTmp$ )
  5877.       rc% = instr( szSearch$, "NOTES.EXE") 
  5878.       If rc% > 2 Then
  5879.           szDir$ = left$(szTmp$, rc% - 2 )
  5880. '                 print "Notes LOTUS.INI Data Directory: " & szDir$
  5881.           lrc& = FDirExists ( szDir$ )
  5882. '                 print "Does LOTUS.INI Directory Exist: " & str( lrc& )
  5883.           If (lrc& = 1) Then
  5884.              szTmp$ = GetIniKeyString( szDir$ & "\" & "Notes.ini", "Notes", "Directory")
  5885. '                        print "Notes Data Directory: " & szTmp$
  5886.              If szTmp$ <> "" Then
  5887.                 lrc& = FDirExists ( szTmp$ )
  5888. '                               print "Does Directory -" & szTmp$ & "- Exist: " & str( lrc& )
  5889.                 If (lrc& = 1) Then
  5890.                    Lot_GetLotusNotesDataPath = szTmp$
  5891.                 End If
  5892.          Else
  5893.             Lot_GetLotusNotesDataPath = szDir$
  5894.          End If
  5895.           End If
  5896.       End If
  5897.    End If
  5898. END FUNCTION
  5899. '*************************************************************************
  5900.  
  5901. PUBLIC FUNCTION Lot_GetLotusNotesPrgPath() AS STRING
  5902. '** Purpose:         Returns the location for the Notes Data Directory
  5903. '** Author:          PTilton
  5904. '** Arguments:       None.
  5905. '** Returns:             NULL String if Notes Data Directory not found.
  5906. '**                  Otherwise, returns directory of Notes Data Directory.
  5907. '*************************************************************************
  5908.    DIM szDir$, szSearch$, szTmp$, rc%, lrc&
  5909.    DIM szPath$, szFile$, szSect$, szKey$, szExe$
  5910.  
  5911.    szPath$ = GetSymbolValue( SYM_WINDIR$ ) & LdString( SID_DATALENS_NOTES_INI )
  5912.    szSect$ = LdString( SID_DATALENS_NOTES_SECT )
  5913.    szKey$ = LdString( SID_DATALENS_NOTES_KEY )
  5914.    szExe$ = LdString( SID_DATALENS_NOTES_EXE )
  5915.  
  5916.    Lot_GetLotusNotesPrgPath = ""
  5917.    szTmp$ = GetIniKeyString( szPath$, szSect$, szKey$ )
  5918.    szSearch$ = ucase$( szTmp$ )
  5919.    rc% = instr( szSearch$, szExe$) 
  5920.    If rc% > 2 Then
  5921.       szDir$ = left$(szTmp$, rc% - 2 )
  5922.       'print "Notes LOTUS.INI Program Directory: " & szDir$
  5923.       lrc& = FDirExists ( szDir$ )
  5924.       'print "Does LOTUS.INI Program Directory Exist: " & str( rc% )
  5925.       If (lrc& = 1) Then
  5926.      Lot_GetLotusNotesPrgPath = szDir$
  5927.       End If
  5928.    End If
  5929. END FUNCTION
  5930. '*************************************************************************
  5931.  
  5932. 'FUNCTION GetLotusNotesDataPath(szFile$, szSect$, szKey$) AS STRING
  5933. '** Purpose:         Returns the location for the Notes Data Directory
  5934. '** Author:          PTilton
  5935. '** Arguments:       None.
  5936. '** Returns:             NULL String if Notes Data Directory not found.
  5937. '**                  Otherwise, returns directory of Notes Data Directory.
  5938. '*************************************************************************
  5939. '   DIM szDir$, rc%
  5940.  
  5941. '   GetLotusNotesDataPath = ""
  5942.    
  5943. '   rc% = DoesIniSectionExist (szFile$, szSect$) 
  5944. '   print "Does Section [" & szSect$ & "] Exist in File("& szFile$ &": " & str( rc% )
  5945. '   If (rc% = 1) Then
  5946. '      rc% = DoesIniKeyExist (szFile$, szSect$, szKey$)
  5947. '      print "Does Key -" & szKey$ & "- Exist: " & str( rc% )
  5948. '      If (rc% = 1) Then
  5949. '         szDir$ = GetIniKeyString (szFile$, szSect$, szKey$)
  5950. '         print "Keyword -" & szKey$ & "- Value: " & szDir$
  5951. '         GetLotusNotesDataPath =szDir$
  5952. '      End If
  5953. '   End If
  5954. 'END FUNCTION
  5955. '*************************************************************************
  5956.  
  5957.  
  5958. PUBLIC FUNCTION Lot_GetORACLEHomePath() AS STRING
  5959. '** Purpose:         Returns the location for the ORACLE Home Directory
  5960. '** Author:          PTilton
  5961. '** Arguments:       None.
  5962. '** Returns:             NULL String if ORACLE Home Directory not found.
  5963. '**                  Otherwise, returns directory of ORACLE Home Directory.
  5964. '*************************************************************************
  5965.    DIM szPath$, szTmp$, rc%, lrc&, szFile$, szSect$, szKey$
  5966.  
  5967.    szPath$ = GetSymbolValue( SYM_WINDIR$ ) & LdString( SID_DATALENS_ORACLE_INI )
  5968.    szSect$ = LdString( SID_DATALENS_ORACLE_SECT )
  5969.    szKey$ = LdString( SID_DATALENS_ORACLE_KEY )
  5970.    Lot_GetORACLEHomePath = ""
  5971.    szTmp$ = GetIniKeyString ( szPath$, szSect$, szKey$ )
  5972.    'print "Oracle Home Directory: " & szTmp$
  5973.    If szTmp$ <> "" Then
  5974.        lrc& = FDirExists ( szTmp$ )
  5975.        'print "Does Directory -" & szTmp$ & "- Exist: " & str( lrc& )
  5976.        If (lrc& = 1) Then
  5977.           Lot_GetORACLEHomePath = szTmp$
  5978.        End If
  5979.    End If
  5980. END FUNCTION
  5981. '*************************************************************************
  5982.  
  5983. PUBLIC FUNCTION Lot_IsDestVerNewerOrEqual(DestinationPath$,sourcever1&,sourcever2&,sourcever3&,sourcever4&) AS INTEGER
  5984. '** Purpose:   This function validates the version of the file
  5985. '** Author:    MZ
  5986. '** Arguments: DestinationPath$,
  5987. '**            SourceVer1&,
  5988. '**            SourceVer2&,
  5989. '**            SourceVer3&,
  5990. '**            SourceVer4&
  5991. '** Returns:   1 if newer or equal
  5992. '**            0 if older or the file is not found or it does not have version
  5993. '*************************************************************************
  5994.    DIM DestFileVersion$
  5995.    DIM DestVer1&,DestVer2&,DestVer3&,DestVer4&, notused%
  5996.  
  5997.    'Find If the file exists
  5998.    IF DoesFileExist(DestinationPath$,femExists)=1 THEN
  5999.  
  6000.       'Find the version
  6001.       DestFileVersion$=GetVersionOfFile(DestinationPath$)
  6002.  
  6003.       'If no version found
  6004.       IF DestFileVersion$="" THEN
  6005.      Lot_IsDestVerNewerOrEqual = 0
  6006.      EXIT FUNCTION
  6007.  
  6008.       'If version found
  6009.       ELSE
  6010.      'Find the version components
  6011.      DestVer1&=GetVersionNthField(DestFileVersion$,1)
  6012.      DestVer2&=GetVersionNthField(DestFileVersion$,2)
  6013.      DestVer3&=GetVersionNthField(DestFileVersion$,3)
  6014.      DestVer4&=GetVersionNthField(DestFileVersion$,4)
  6015.  
  6016.      'Compare the version
  6017.      IF SourceVer1& > DestVer1& THEN
  6018.         Lot_IsDestVerNewerOrEqual = 0
  6019.         EXIT FUNCTION
  6020.      ELSEIF SourceVer1& = DestVer1& AND _
  6021.         SourceVer2& > DestVer2& THEN
  6022.         Lot_IsDestVerNewerOrEqual = 0
  6023.         EXIT FUNCTION
  6024.      ELSEIF SourceVer1& = DestVer1& AND _
  6025.         SourceVer2& = DestVer2& AND _
  6026.         SourceVer3& > DestVer3& THEN
  6027.         Lot_IsDestVerNewerOrEqual = 0
  6028.         EXIT FUNCTION
  6029.      ELSEIF SourceVer1& = DestVer1& AND _
  6030.         SourceVer2& = DestVer2& AND _
  6031.         SourceVer3& = DestVer3& AND _
  6032.         SourceVer4& > DestVer4& THEN
  6033.         Lot_IsDestVerNewerOrEqual = 0
  6034.         EXIT FUNCTION
  6035.      ELSEIF SourceVer1& = DestVer1& AND _
  6036.         SourceVer2& = DestVer2& AND _
  6037.         SourceVer3& = DestVer3& AND _
  6038.         SourceVer4& = DestVer4& THEN
  6039.         'Version is equal. Delete the source
  6040.         Lot_IsDestVerNewerOrEqual = 1
  6041.         EXIT FUNCTION
  6042.      ELSE
  6043.         'Dest is newer.
  6044.         Lot_IsDestVerNewerOrEqual = 1
  6045.         EXIT FUNCTION
  6046.      END IF
  6047.  
  6048.       END IF
  6049.    'file not found in the destination
  6050.    ELSE
  6051.       Lot_IsDestVerNewerOrEqual = 0
  6052.       EXIT FUNCTION
  6053.    END IF
  6054. END FUNCTION
  6055.  
  6056. CONST ObjectPrefix$="Object"
  6057. CONST gMISCINSTALLEDOBJECTS="Miscellaneous Installed Objects"
  6058.  
  6059. SUB PopulateCOBJECTLIST(iniPath$)
  6060. '*************************************************************************
  6061. '** Purpose:         Compiles a list of objects already in the cinstall or
  6062. '**                  cinstnod.ini file; populates list COBJECT
  6063. '** Author:          JMD
  6064. '** Arguments:       Full pathname of .INI file
  6065. '** Returns:             NULL String if Notes Data Directory not found.
  6066. '**                  Otherwise, returns directory of Notes Data Directory.
  6067. '*************************************************************************
  6068.    DIM Number%
  6069.    DIM Tag$, ID$, rc%
  6070.  
  6071.     IF DoesFileExist(iniPath$,femExists) = 1 THEN
  6072.         Erase COBJECT 
  6073.         Number%=1
  6074.         Tag$=ObjectPrefix$+LTRIM$(STR$(Number%))
  6075.         ID$ = GetIniKeyString(iniPath$, gMISCINSTALLEDOBJECTS, Tag$)
  6076.         WHILE ID$ <> ""
  6077.             COBJECT (ID$) = "1"
  6078.             Number% = Number% + 1
  6079.             Tag$=ObjectPrefix$+LTRIM$(STR$(Number%))
  6080.             ID$ = GetIniKeyString(iniPath$, gMISCINSTALLEDOBJECTS, Tag$)
  6081.         WEND
  6082.     ELSE
  6083.  '** DND: Look into using ShowPathError here. We should tell the
  6084.  '**      user where we looked for install.ini
  6085.         FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  6086.     END IF
  6087.  
  6088. END SUB
  6089.  
  6090. SUB PopulateCINSTALLLIST
  6091.    DIM prodDir$, installIniFile$, FeaturePref$, Featurenumber%
  6092.    DIM FeatureTag$, FeatureID$, rc%
  6093.    STATIC gCINSTALLinited%  ''ASSUME gCINSTALLinited% starts as zero
  6094.  
  6095.    If  gCINSTALLinited% <> 1 Then
  6096.       gNCINSTALL% = 0
  6097.       gCINSTALLinited% = 1
  6098.  
  6099.       'Built the path to install.ini
  6100.       prodDir$ = Lot_GetInstallDir()
  6101.       installIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  6102.  
  6103.       FeaturePref$ = "Feature"
  6104.       FeatureNumber%=1
  6105.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6106.       FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6107.       IF DoesFileExist(installIniFile$,femExists) = 1 THEN
  6108.     IF FeatureID$ <> "" THEN
  6109.        DO
  6110.           CINSTALL (FeatureID$) = "1"
  6111.           gNCINSTALL% = gNCINSTALL%+1
  6112.           FeatureNumber% = FeatureNumber% + 1
  6113.           FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6114.           FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6115.        LOOP UNTIL FeatureID$ = ""
  6116.         END IF
  6117.       ELSE
  6118.      '** DND: Look into using ShowPathError here. We should tell the
  6119.      '**      user where we looked for install.ini
  6120.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  6121.       END IF
  6122.    END IF
  6123. END SUB
  6124.  
  6125. '*************************************************************************
  6126. SUB PopulateCINSTNODELIST
  6127.    DIM prodDir$, installIniFile$, FeaturePref$, Featurenumber%
  6128.    DIM FeatureTag$, FeatureID$, rc%, dirSym$, inidir$
  6129.    STATIC gCINSTNODEinited%  ''ASSUME gCINSTALLinited% starts as zero
  6130.  
  6131.    If  gCINSTNODEinited% <> 1 Then
  6132.       gNCINSTNODE% = 0
  6133.       gCINSTNODEinited% = 1
  6134.  
  6135.       'Built the path to cinstnod.ini
  6136.       dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  6137.       IF GetListLength(dirSym$) >= 1 THEN
  6138.         dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  6139.         inidir$ = GetSymbolValue(dirSym$) 
  6140.               installIniFile$ = MakePath(inidir$,"cinstnod.ini")
  6141.       END IF
  6142.  
  6143.       FeaturePref$ = "Feature"
  6144.       FeatureNumber%=1
  6145.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6146.       FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6147.       IF DoesFileExist(installIniFile$,femExists) = 1 THEN
  6148.     IF FeatureID$ <> "" THEN
  6149.        DO
  6150.           CINSTNODE (FeatureID$) = "1"
  6151.           gNCINSTNODE% = gNCINSTNODE%+1
  6152.           FeatureNumber% = FeatureNumber% + 1
  6153.           FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6154.           FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6155.        LOOP UNTIL FeatureID$ = ""
  6156.         END IF
  6157.       ELSE
  6158.      '** DND: Look into using ShowPathError here. We should tell the
  6159.      '**      user where we looked for install.ini
  6160.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  6161.       END IF
  6162.    END IF
  6163. END SUB
  6164.  
  6165. '*************************************************************************
  6166. '** PUBLIC FUNCTION TrimNetlotusapp (path$) AS STRING
  6167. '**
  6168. '** Purpose:   trims the net lotusapp directory to detect mapping. 
  6169. '** Author:    Thangv
  6170. '** Arguments: path$ 
  6171. '** Returns:   the modified path
  6172. '*************************************************************************
  6173.  
  6174. PUBLIC FUNCTION TrimNetlotusapp (ByVal path$) AS STRING
  6175.  
  6176.    DIM  firstslash%, newpath$, drive$
  6177.    
  6178.    TrimNetlotusapp = ""
  6179.    path$ = Lot_TrimEndSlash (path$)
  6180.    drive$ = LEFT(path$, 2)
  6181.    
  6182.    firstslash% = INSTR(1,path$,"\")
  6183.    WHILE firstslash% <> 0
  6184.       path$ = MID$(path$,firstslash%+1)
  6185.       newpath$ = drive$ + "\" + path$
  6186.       IF DoesDirExist(newpath$) = 1 THEN
  6187.      TrimNetlotusapp = newpath$ + "\"
  6188.      EXIT FUNCTION     
  6189.       ELSE 
  6190.      firstslash% = INSTR(1,path$,"\")                       
  6191.       END IF
  6192.    WEND
  6193.  
  6194. END FUNCTION
  6195.  
  6196. PUBLIC FUNCTION Lot_RegisterUninstaller(ProdRegKeyName$,ProdVer$,_
  6197.                     ProdDisplayedName$,ProdInfPath$,_
  6198.                     LogFlag%,AutoFlag%,_
  6199.                     LangID$,LogFile$,RspFile$,_
  6200.                     UserName$ ) AS INTEGER
  6201. '** Purpose:   Registers the uninstaller for a product and builds the uninstall
  6202. '**            command line. This function should be called in PostCopyConfig()
  6203. '** Author:    MZ
  6204. '** Arguments: ProdRegKeyName$     The name of the product key in the registry
  6205. '**            ProdVer$            The version of the product installed
  6206. '**            ProdDisplayedName$  The description of the product put into the registry
  6207. '**            ProdInfPath$        The path of the standalone/server INF file
  6208. '**            LogFlag%            TRUE/FALSE if you want uninstall to produce or not a log
  6209. '**            AutoFlag%           TRUE/FALSE if you want uninstall to run or not silantelly
  6210. '**            LangID$             The default language for uninstall
  6211. '**            LogFile$ (optional) The log file path to overwrite the default provided by uninstall
  6212. '**            RspFile$ (optional) The response file path to overwrite the default provided by uninstall
  6213. '**            UserName$(optional) The User Name
  6214. '** Returns:   True if worked False otherwise
  6215. '*************************************************************************
  6216. DIM gInstallIniFile$,cwd$,prodDir$,Network$,ProdNameAndVer$,CommandLine$ 
  6217. DIM Platform%, PlatformStr$, LReturn&, grouptitle$, Caption$, dirSym$, RegKey$
  6218. DIM s$, szkey$, IsRootProduct%
  6219.  
  6220.    'Validate the arguments
  6221.    IF ProdRegKeyName$ = "" OR _
  6222.       ProdVer$ = "" OR _
  6223.       ProdDisplayedName$ = "" OR _
  6224.       ProdInfPath$ = "" OR _
  6225.       LangID$ = "" THEN
  6226.       Lot_RegisterUninstaller = FALSE
  6227.    END IF
  6228.  
  6229.    IF LogFlag% <> FALSE AND LogFlag% <> TRUE THEN
  6230.       Lot_RegisterUninstaller = FALSE
  6231.    END IF
  6232.  
  6233.    IF AutoFlag% <> FALSE AND AutoFlag% <> TRUE THEN
  6234.       Lot_RegisterUninstaller = FALSE
  6235.    END IF
  6236.    
  6237.    Network$ = GetSymbolValue(SYM_NETWORK$)
  6238.  
  6239.  'TV: For server, distribution installs don't register uninstall
  6240.     IF Network$ = gSERVER$ OR Network$ = gDISTRIBUTION$ THEN EXIT FUNCTION
  6241.  
  6242.     ' The first product, either suite or this product for standalone
  6243.     ProdNameAndVer$ = MakePath(GetSymbolValue(SYM_REG_PRODUCTNAME$) , GetSymbolValue(SYM_REG_PRODUCTVER$))
  6244.     s$ = MakePath(ProdRegKeyName$, ProdVer$)
  6245.     IsRootProduct% = (ProdNameAndVer$ =  s$)
  6246. 'Only register suite uninstaller, or single product
  6247. IF IsRootProduct% THEN
  6248.     
  6249.    'Built the path to cinstall.ini
  6250.    IF Network$ = gNODE$ THEN
  6251.       'Get the target directory for the product
  6252.       dirSym$ = Reg_GetDirSymbolList(Lot_GetCurrentProduct())
  6253.       If GetListLength(dirSym$) >= 1 Then
  6254.          dirSym$ = GetListItem(dirSym$, 1)
  6255.          gInstallIniFile$ = GetSymbolValue(dirSym$)+"Cinstnod.ini"
  6256.       End If
  6257.    ELSEIF Network$=gSERVER$ OR Network$=gSTANDARD THEN
  6258.       'Get the install directory
  6259.       prodDir$ = Lot_GetInstallDir()
  6260.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  6261.    END IF
  6262.  
  6263.    'print gInstallIniFile$,"gInstallIniFile$"
  6264.    PlatformStr$ = gREGWINNAME
  6265.  
  6266.    'Write the uninstall key and registry values
  6267.     RegKey$=PlatformStr$+"\Uninstall\"+ProdRegKeyName$+" V"+ProdVer$
  6268.    LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE, RegKey$)
  6269.   'print " after calling Lot_RegCreateKeyEx in share32",LReturn&
  6270.   IF LReturn& <> ERROR_SUCCESS THEN
  6271.      Lot_RegisterUninstaller = FALSE
  6272.       RegErrorMsg SID_ERR_REG_CREATE, gHLM$+"\"+RegKey$,"",""
  6273.   END IF
  6274.         
  6275.   'Write the display name key and value
  6276.   'print " before calling Lot_CreateRegKeyValueEx in share32"        
  6277.   LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, RegKey$,_
  6278.               "DisplayName",_
  6279.               REG_SZ,_
  6280.               ProdDisplayedName$, _
  6281.               LENBP(ProdDisplayedName$)+1)
  6282.   'print " after calling Lot_CreateRegKeyValueEx in share32",LReturn&
  6283.   IF LReturn& <> ERROR_SUCCESS THEN
  6284.       Lot_RegisterUninstaller = FALSE
  6285.        RegErrorMsg SID_ERR_REG_UNINST, gHLM$+RegKey$,"DisplayName",ProdDisplayedName$
  6286.   END IF
  6287.  
  6288.   'Build the command line
  6289.   CommandLine$ = | /T | & ProdRegKeyName & | /V | & ProdVer$
  6290.   IF IsNewShell() THEN
  6291.         CommandLine$ = CommandLine$ & | /I "| & ProdInfPath$ & |"|
  6292.         CommandLine$ = CommandLine$ & | /C "| & gInstallIniFile$ & |"|   
  6293.     ELSE
  6294. 'JMD:
  6295. '    NT 3.51 has a bug that truncates the command line in the program icon if
  6296. '    there are embedded quotes; therefore embedded quotes are NOT supported for
  6297. '    NT 3.51 (old Win 3.1 shell) only
  6298.         CommandLine$ = CommandLine$ & " /I " & ProdInfPath$
  6299.         CommandLine$ = CommandLine$ & " /C " & gInstallIniFile$
  6300.     END IF
  6301.   IF LogFlag% <> FALSE THEN
  6302.      CommandLine$ = CommandLine$+" /O "
  6303.   END IF
  6304.   IF LogFile$ <> "" THEN
  6305.      CommandLine$ = CommandLine$+LogFile$
  6306.   END IF
  6307.   IF AutoFlag% <> FALSE THEN
  6308.      CommandLine$ = CommandLine$+" /A "
  6309.   END IF
  6310.   IF RspFile$ <> "" THEN
  6311.      CommandLine$ = CommandLine$+RspFile$
  6312.   END IF
  6313.   CommandLine$ = CommandLine$+" /L "+LangID$
  6314.   IF UserName$ <> "" THEN
  6315.      CommandLine$ = CommandLine$+" /U "+UserName$
  6316.   END IF    
  6317.   CommandLine$ = GetWindowsDir()+gUNINSTALLEXE+CommandLine$
  6318.  
  6319.     ' Register it under the first product (suit or main product for single)
  6320.     s$ = Reg_GetProductAcronym(1) + gTOP$
  6321.   IF NOT IsNewShell() THEN
  6322.         Caption$ = ProdRegKeyName$+" V"+ProdVer$+" "+gUNINSTALL
  6323.       grouptitle$ = Reg_GetProgManagerGroupName(1)
  6324.     CreateProgmanItem grouptitle$, Caption$, CommandLine$, GetWindowsDir()+gUNINSTALLEXE, cmoOverwrite
  6325.     Lot_RegisterObject s$, UNIN_CLASS_ICON$, grouptitle$ + "\" + Caption$
  6326.   END IF
  6327.  
  6328.   'print CommandLine$,"CommandLine$"
  6329.   'Write the CommandLine
  6330.   'print " before calling Lot_CreateRegKeyValueEx in share32"        
  6331.   LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, RegKey$,_
  6332.               "UninstallString",_
  6333.               REG_SZ,_
  6334.               CommandLine$, _
  6335.               LENBP(CommandLine$)+1)
  6336.   'print " after calling Lot_CreateRegKeyValueEx in share32",LReturn&        
  6337.  
  6338.   IF LReturn& <> ERROR_SUCCESS THEN
  6339.       Lot_RegisterUninstaller = FALSE
  6340.        RegErrorMsg SID_ERR_REG_UNINST, gHLM$+RegKey$,"UninstallString",CommandLine$
  6341.   ELSE
  6342.       Lot_RegisterUninstaller = TRUE
  6343.   END IF
  6344.     ' Tell uninstall about the uninstall entry in registry
  6345.     Lot_RegisterObject s$, UNIN_CLASS_REGISTRY_VALUE$,_
  6346.         gHLM$ + "\" + RegKey + "\" + "UninstallString"
  6347.  
  6348. END IF    ' IF IsRootProduct% 
  6349.  
  6350.     ' Register suite products for Suite uninstall
  6351.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6352.     szkey$ = gREGLOTUS + ProdNameAndVer$ + "\Products\"
  6353.     szkey$ = szkey$  + ProdRegKeyName$ + "\" +  ProdVer$
  6354.     IF s$ = gSMARTSUITE$ THEN
  6355.         IF NOT IsRootProduct% THEN
  6356.             IF Lot_DoesRegKeyExistEx(HKEY_LOCAL_MACHINE, szKey$) = FALSE THEN
  6357.                 IF Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKey$) <> 0 THEN
  6358.                     Lot_RegisterUninstaller = FALSE
  6359.                     EXIT FUNCTION
  6360.                 END IF
  6361.             END IF
  6362.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, szKey$,_
  6363.               "InfFileName", REG_SZ, ProdInfPath$, LENBP(ProdInfPath$)+1)
  6364.         END IF
  6365.     ELSE
  6366.         ' Delete these entries so single prodcut uninstall can work
  6367.         IF Lot_DoesRegKeyExistEx(HKEY_LOCAL_MACHINE, szKey$) = TRUE THEN _
  6368.             LReturn& = Lot_RegDelAllSubKeys(HKEY_LOCAL_MACHINE, szKey)
  6369.     END IF
  6370.     Lot_RegisterUninstaller = (LReturn& = ERROR_SUCCESS)
  6371.  
  6372. END FUNCTION
  6373.  
  6374. PUBLIC FUNCTION Lot_RegisterObject(FeatureKeyWord$, ClassOfObject$, ObjectPath$)
  6375. '** Purpose:   Registers the [Miscellaneous Installed Objects] into cinstall.ini 
  6376. '**            for standalone installs and into cinsnode.ini for node installs
  6377. '** Author:    MZ
  6378. '** Arguments: FeatureKeyWord$     The KeyWord of the section that is associate 
  6379. '**                                with this object
  6380. '**            ClassOfObject$      The classes; The predefined (in globals.lss)
  6381. '**                                classes are: 
  6382. '**                                UNIN_CLASS_PROGRAM_GROUP$
  6383. '**                                UNIN_CLASS_ICON$
  6384. '**                                UNIN_CLASS_FOLDER$
  6385. '**                                UNIN_CLASS_SHORTCUT$
  6386. '**                                UNIN_CLASS_START_MENU_ENTRY$
  6387. '**                                UNIN_CLASS_REGISTRY_KEY$
  6388. '**                                UNIN_CLASS_REGISTRY_VALUE$
  6389. '**                                UNIN_CLASS_REGISTRY_HIVE$
  6390. '**                                UNIN_CLASS_FILE$
  6391. '**                                UNIN_CLASS_FILE_GROUP$
  6392. '**                                UNIN_CLASS_DIRECTORY$
  6393. '** Returns:   True if worked False otherwise
  6394. '*************************************************************************
  6395. DIM gInstallIniFile$,inidir$, s$,Network$
  6396. DIM NodeInstIniFile$,ObjectNum%,lrc&, ObjectPref$
  6397. DIM ObjectTag$, ObjectID$, LastObjectNumber%, dirSym$, temp%
  6398. DIM ObjectName$
  6399. STATIC iniPath$
  6400. STATIC ThisInstallType$
  6401.  
  6402.    'Get the install type
  6403.    Network$ = GetSymbolValue(SYM_NETWORK$)
  6404.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6405.  
  6406.     IF NOT IsNewShell() AND ClassOfObject$ = UNIN_CLASS_ICON$ THEN
  6407.         temp% = INSTR(ObjectPath$, "\")
  6408.         IF LEN(ObjectPath$) > temp%+40 THEN
  6409.             ObjectPath$ = LEFT$(ObjectPath$, temp%+40)
  6410.         END IF
  6411.     END IF
  6412.  
  6413.     'TV: For server and distribution installs don't register any objects
  6414.     IF Network$ = gSERVER$ OR Network$ = gDISTRIBUTION$ THEN EXIT FUNCTION 
  6415.     
  6416.     '** Initialization:
  6417.     IF ThisInstallType$ <> Network$ THEN
  6418.         ThisInstallType$ = Network$
  6419.         '** Built the path to cinstall.ini (in standalone case) 
  6420.         '** or cinstnod.ini (in NODE case)
  6421.         IF Network$ = gNODE$ AND s$ = gSMARTSUITE$ THEN
  6422.             inidir$ = GetSymbolValue(SYM_BASEDIR$)
  6423.             NodeInstIniFile$ = inidir$+"cinstnod.ini"
  6424.             iniPath$ = NodeInstIniFile$
  6425.         ELSEIF Network$ = gNODE$ AND s$ = gSINGLE$ THEN
  6426.             dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  6427.             IF GetListLength(dirSym$) >= 1 THEN
  6428.                 dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  6429.                 inidir$ = GetSymbolValue(dirSym$) 
  6430.             ELSE
  6431.                 inidir$ = GetSymbolValue(SYM_STF_CWDDIR$)
  6432.             END IF
  6433.             NodeInstIniFile$ = inidir$+"cinstnod.ini"
  6434.             iniPath$ = NodeInstIniFile$
  6435.         ELSEIF Network$=gSTANDARD THEN
  6436.             'Get the install directory
  6437.             inidir$ = Lot_GetInstallDir()
  6438.             gInstallIniFile$ = MakePath(inidir$,gINSTALLINI$)
  6439.             iniPath$ = gInstallIniFile$
  6440.         END IF
  6441.         'print iniPath$,"IniPath$"
  6442.         '** Construct a list of objects already there
  6443.         PopulateCOBJECTLIST(iniPath$)
  6444.     END IF
  6445.  
  6446.     'Get last object number
  6447.     ObjectPref$ = "Object"
  6448.     ObjectNum%=1
  6449.     ObjectTag$=ObjectPref$+LTRIM$(STR$(ObjectNum%))
  6450.  
  6451.     lrc& = DoesFileExist(iniPath$,femExists)
  6452.     IF lrc& = 1 THEN
  6453.         ObjectID$ = GetIniKeyString(iniPath$, gMISCINSTALLEDOBJECTS, _
  6454.                         ObjectTag$)
  6455.         IF ObjectID$ = "" THEN
  6456.             LastObjectNumber% = 0
  6457.         ELSE   
  6458.             WHILE (ObjectID$ <> "")
  6459.                 ObjectNum% = ObjectNum% + 1
  6460.                 ObjectTag$ = ObjectPref$+LTRIM$(STR$(ObjectNum%))
  6461.                 ObjectID$  = GetIniKeyString(iniPath$, gMISCINSTALLEDOBJECTS, _
  6462.                                 ObjectTag$)
  6463.             WEND
  6464.             LastObjectNumber% = ObjectNum%-1
  6465.         END IF
  6466.     ELSE      
  6467.         LastObjectNumber% = 0
  6468.     END IF
  6469.     'print LastObjectNumber%,"LastObjectNumber%"
  6470.  
  6471.     'See if the object's already there, if not, write a new object
  6472.     ObjectName$ = FeatureKeyWord$+","+ClassOfObject$+","+ObjectPath$
  6473.    If ISELEMENT(COBJECT(ObjectName$)) = FALSE THEN _
  6474.         CreateIniKeyValue iniPath$, gMISCINSTALLEDOBJECTS,_
  6475.                     "Object"+LTRIM$(STR$(LastObjectNumber%+1)), _
  6476.                     ObjectName,  cmoOverwrite
  6477.  
  6478. END FUNCTION
  6479.  
  6480. '*************************************************************************
  6481. PUBLIC FUNCTION Lot_GetDestDirValueFromInstallini(DestDirSym$) AS STRING
  6482. '**
  6483. '** Purpose:   trims the net lotusapp directory to detect mapping. 
  6484. '** Author:    Thangv, PD, JMD
  6485. '** Arguments: path$ 
  6486. '** Returns:   the modified path
  6487. '*************************************************************************
  6488. DIM DestDirSymVal$, rv%, source$
  6489. DIM gInstallIniFile$,inidir$
  6490. DIM uncvol$, dirPath$
  6491. DIM iniPath$    
  6492.  
  6493.     Lot_GetDestDirValueFromInstallini = ""
  6494.     'Get the install directory
  6495.     'Save initial value since it may change over course of install
  6496.     inidir$ = Lot_GetInstallDir()
  6497.     gInstallIniFile$ = MakePath(inidir$,gINSTALLINI$)
  6498.     iniPath$ = gInstallIniFile$
  6499.     DestDirSymVal$ = GetIniKeyString(iniPath$,_
  6500.                  "Destination Symbols And Values", _
  6501.                  DestDirSym$)
  6502.     IF  DestDirSymVal$ <> "" THEN
  6503.         rv% = DoesDirExist(DestDirSymVal$)
  6504.         IF rv% = 0 THEN
  6505.                 '** TV: shouldn't get here even if destdirSymVal is UNC
  6506.         source$ =  GetSymbolValue(SYM_STF_SRCDIR$)
  6507.                 IF NOT Lot_IsUnvalidatedUNCPath(source$) THEN
  6508.                 DestDirSymVal$ = MID$(source$,1,1)+MID$(DestDirSymVal$,2)
  6509.                 ELSE
  6510.                         Lot_SplitUNCPath source$, uncvol$, dirPath$
  6511.                 DestDirSymVal$ = uncvol$ + MID$(DestDirSymVal$,3)
  6512.                 END IF        
  6513.         rv% = Lot_CleanPath(DestDirSymVal$)
  6514.  
  6515.             IF rv% = 0 THEN
  6516.                   ErrorMsg SID_ERR_NODENETMAP, ""
  6517.                   ERROR STFQUIT
  6518.         END IF
  6519.         END IF
  6520.     END IF
  6521.  
  6522.     Lot_GetDestDirValueFromInstallini = DestDirSymVal$
  6523. END FUNCTION
  6524.  
  6525. '*************************************************************************
  6526. PUBLIC SUB      Lot_WriteCriticalDirectories (InstallInifile$)
  6527. '**
  6528. '** Purpose:   writes out the critical directories for uninstall in 
  6529. '**            cinstall.ini, cinstnod.ini   
  6530. '** Author:    Thangv
  6531. '** Arguments: path to cinstall.ini/cinstnod.ini file 
  6532. '** Returns:   
  6533. '*************************************************************************
  6534.    DIM dirsyms%, gInstallIniFile$, prodDir$, progdir$
  6535.    DIM prodsym$, AllProdNum%, prodNum%, symList$, i%
  6536.  
  6537.       'the path to install.ini
  6538.       gInstallIniFile$ = InstallInifile$
  6539.  
  6540.    's$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6541.  
  6542.       'Loop through the products and log the directories
  6543.       AllProdNum% = 0
  6544.       AllProdNum% = Reg_GetNumberOfProducts()
  6545.       IF AllProdNum% <> 0 THEN
  6546.      'BaseDir$= GetSymbolValue(SYM_BASEDIR$)
  6547.      FOR prodNum%=1 TO AllProdNum%
  6548.         'ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  6549.         'Get the directory symbol
  6550.         symList$ = Reg_GetDirSymbolList(prodNum%)
  6551.         dirsyms% = GetListLength(symList$)
  6552.         FOR i% = 1 TO dirsyms% 
  6553.         prodsym$ = GetListItem(symList$, i%)
  6554.         progdir$ = GetSymbolValue(prodsym$)
  6555.         CreateIniKeyValue gInstallIniFile$, "Critical Directories", prodsym$, progdir$, cmoOverWrite
  6556.         NEXT
  6557.      NEXT
  6558.       END IF
  6559. END SUB
  6560.  
  6561.  
  6562. PUBLIC FUNCTION GetLastPathComponent( ByVal szPath$) AS STRING
  6563. '**
  6564. '** Purpose:   Returns the last component of a path
  6565. '**
  6566. '** Author:    GJL
  6567. '** Arguments: path 
  6568. '** Returns: The last dir name or file name, empty string if path
  6569. '**          ends in \
  6570. '*************************************************************************
  6571.     DIM offSet&, nextOff&
  6572.  
  6573.     GetLastPathComponent$ = szPath$
  6574.     offSet& = InStr(szPath$,"\")
  6575.     nextOff& = offSet&
  6576.  
  6577.     DO WHILE nextOff& <> 0
  6578.        nextOff = InStr(Mid$(szPath$,offset),"\")
  6579.        offSet& = offSet& + nextOff& 
  6580.  
  6581.     LOOP
  6582.     IF offSet& > 0 THEN
  6583.       GetLastPathComponent$ = Mid$(szPath$,offSet&)
  6584.     END IF
  6585. END FUNCTION
  6586.  
  6587. '*************************************************************************
  6588. FUNCTION Lot_AddToNTSystemPath(RegH&, RegKey$, VarName$, ByVal AddPath$) AS INTEGER
  6589.     DIM NewPath$, notused&, PathDir$
  6590.     DIM RegValLen&, Pos%, Resave%
  6591.  
  6592.     Lot_AddToNTSystemPath = 1
  6593.  
  6594.     If Lot_DoesRegKeyExistEx(RegH&, RegKey$) = FALSE THEN
  6595.         If Lot_RegCreateKeyEx(RegH&, RegKey$) <> 0 Then
  6596.             Lot_AddToNTSystemPath = 0
  6597.             EXIT FUNCTION
  6598.         End If
  6599.         NewPath = ""
  6600.     Else
  6601.         RegValLen&=CLNG(1024)
  6602.         NewPath$=CreateBuffer(RegValLen&)
  6603.         if Lot_GetRegKeyValueEx(RegH&, RegKey$, VarName$,_
  6604.                 REG_EXPAND_SZ&,NewPath$,RegValLen&) <> 0 Then
  6605.             NewPath = ""
  6606.         End If
  6607.     End If
  6608.  
  6609.     NewPath$ = NullTrim(NewPath$)        
  6610.     Resave%=0
  6611.     Do While AddPath$ <> ""
  6612.         Pos%=InStr(AddPath$,";")
  6613.  
  6614.         If Pos=0 Then
  6615.             PathDir$ = AddPath$
  6616.             AddPath = ""
  6617.         Else
  6618.             PathDir$ = Left$(AddPath$, Pos%-1)
  6619.             If RIGHT$(PathDir$,1) = "\" Then
  6620.                 PathDir$ = LEFT$(PathDir$, LEN(PathDir$)-1)
  6621.             End If
  6622.             AddPath = Right$(AddPath$, LEN(AddPath)-Pos%)
  6623.         End If
  6624.  
  6625.         If InStr(NewPath$,PathDir$) = 0 Then
  6626.            If NewPath = "" Then
  6627.                 NewPath=PathDir$
  6628.             Else
  6629.                 NewPath=NewPath$+";"+PathDir$
  6630.             End If
  6631.             Resave%=1
  6632.         End If
  6633.     Loop
  6634.     If Resave%=1 Then
  6635.         If Lot_CreateRegKeyValueEx(RegH&, RegKey$, VarName$,_
  6636.                REG_EXPAND_SZ&,NewPath$,LEN(NewPath$)+1) Then
  6637.             Lot_AddToNTSystemPath = 0
  6638.         End If
  6639.     End If
  6640.  
  6641. END FUNCTION
  6642.  
  6643. '*************************************************************************
  6644. PUBLIC FUNCTION Lot_RegAppPath(ProgName$, szProgPath$, ByVal szSearchPath$, ByVal fCompPath%, ByVal KeyWord$) AS INTEGER
  6645.  
  6646. '** Purpose:   Add application path to registry
  6647. '** Author:    OM
  6648. '** Arguments: 
  6649. '**        ProgName$:        Name of the program file
  6650. '**        szProgPath$:   This is the path of program named above. It
  6651. '**                            may be entered with or without the final '\'
  6652. '**        szSearchPath$: Directories separated by ';' to be added to search
  6653. '**                            path.  Directories should not have final '\'.
  6654. '**        fCompPath:        True if component path should be added to search
  6655. '**                            path.  False if not.
  6656. '**      KeyWord$:        The feature keyword associated with this object.
  6657. '**                            For example, "FLWCORE"
  6658. '**
  6659. '** Returns:   True if worked False otherwise
  6660. '*************************************************************************
  6661.     DIM RegKey$, RegH&, PathDir$, notused&, s$, network$ 
  6662.  
  6663.     szSearchPath$ = NullTrim(szSearchPath$)
  6664.     szSearchPath$ = LTrim(szSearchPath$)
  6665.     If fCompPath% Then
  6666.         network$ = GetSymbolValue(SYM_NETWORK$)
  6667.         IF network$ = gNODE$ THEN
  6668.             s$ = GetSymbolValue(SYM_NETCOMPONENT$)
  6669.         ELSE
  6670.             s$ = GetSymbolValue(SYM_COMPONENTSDIR$)
  6671.         END IF
  6672.         szSearchPath$ = szSearchPath$+";" + s$
  6673.         szSearchPath$ = NullTrim(szSearchPath$)
  6674.         szSearchPath$ = LEFT$(szSearchPath$,LEN(szSearchPath$)-1)
  6675.     End If
  6676.     
  6677.     Lot_RegAppPath = 1
  6678.  
  6679.     RegH&=HKEY_LOCAL_MACHINE&
  6680.     RegKey$=gREGWINNAME+gREGAPPPATH95+"\"+ProgName$
  6681.     If Lot_DoesRegKeyExistEx(RegH&, RegKey$) = FALSE THEN
  6682.         notused&=Lot_RegCreateKeyEx(RegH&, RegKey$)
  6683.     End If
  6684.     If NOT RIGHT$(szProgPath$,1) = "\" Then
  6685.         szProgPath$ = szProgPath$ + "\"
  6686.     End If
  6687.     PathDir$ = szProgPath+ProgName$
  6688.     if Lot_CreateRegKeyValueEx(RegH&,RegKey$,"",_
  6689.             REG_SZ,PathDir$,LEN(PathDir$)+1) OR _
  6690.          Lot_CreateRegKeyValueEx(RegH&,RegKey$,gREGAPPPATH95PATH,_
  6691.             REG_SZ,szSearchPath$,LEN(szSearchPath$)+1) Then
  6692.         Lot_RegAppPath = 0
  6693.     Else
  6694.         RegKey$ = gHLM$+"\"+RegKey$
  6695.         Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6696.     End If        
  6697.  
  6698.     If NOT IsNewShell() Then
  6699.         If Lot_AddToNTSystemPath(HKEY_LOCAL_MACHINE&, _
  6700.             gREGAPPPATHNT1, gREGAPPPATHNTPATH, szSearchPath$) = 0 Then
  6701.             If Lot_AddToNTSystemPath(HKEY_CURRENT_USER&, _
  6702.                 gREGAPPPATHNT2, gREGAPPPATHNTPATH, szSearchPath$) = 0 Then
  6703.                 Lot_RegAppPath = 0
  6704.             Else
  6705.                 RegKey$ = gHCU$+"\"+gREGAPPPATHNTPATH
  6706. '                Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6707.             End If
  6708.         Else
  6709.             RegKey$ = gHCU$+"\"+gREGAPPPATHNTPATH
  6710. '            Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6711.         End If
  6712.     End If
  6713.     If Lot_RegAppPath = 0 Then
  6714.         RegErrorMsg SID_ERR_REG_APPPATH, RegKey$, gREGAPPPATH95PATH, szSearchPath$
  6715.     End If
  6716. END FUNCTION
  6717.  
  6718. DIM FixupDirectorySymbolList LIST AS STRING
  6719.  
  6720. PUBLIC SUB MarkFixupSourceDirSymbol(szSubdirSymbol$)
  6721. '*************************************************************************
  6722. '** Purpose: Adds the symbol to a list of subdirectory symbols that must
  6723. '**    be reset for a node install based on contents of cinstall.ini on the
  6724. '**   server
  6725. '**  
  6726. '** Author: JMDonohue
  6727. '** Arguments:    szSubdirSymbol$    Symbol to reset
  6728. '**************************************************************************
  6729.     if (ISELEMENT(FixupDirectorySymbolList(szSubdirSymbol$)) = 0 ) then _
  6730.         FixupDirectorySymbolList(szSubdirSymbol$) = "Yes"
  6731. END SUB
  6732.  
  6733. PUBLIC SUB Lot_FixupSourceDirectories
  6734. '*************************************************************************
  6735. '** Purpose: Changes the source location for node install files based on 
  6736. '**     the location recorded in the cinstall.ini file on the server
  6737. '**  
  6738. '** Author: JMDonohue
  6739. '** Arguments: 
  6740. '**************************************************************************
  6741.     DIM ret%, s$
  6742.     DIM rc%, Src$, chapter$, Dest$, DirSym$, Sect$
  6743.  
  6744.     FORALL sym IN FixupDirectorySymbolList 
  6745.  
  6746.         chapter$ = Lot_GetFirst("", F_NOTHING)
  6747.         WHILE (chapter$ <> "")
  6748.             DirSym$ = Lot_GetChapterValStr(chapter$, F_DESTDIRSYM)
  6749.             IF DirSym$ = ListTag(sym) AND _
  6750.             INT(Lot_GetChapterValInt(chapter$,F_INOROUT)) = 1 THEN
  6751.                 Src$ = Lot_GetDestDirValueFromInstallIni(DirSym$)
  6752.                 IF Src$ <> "" THEN 
  6753.                 '' Adjust the path to account for an extra product level for the 
  6754.                 '' filename in the node .INF file
  6755.                     Src$ = OneUp(Src$)
  6756.                     IF Src$ = "" THEN GOTO SYMBOLERROR
  6757.                     s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6758.                     '' For suite, need to remove two levels
  6759.                     IF s$ = gSMARTSUITE$ THEN 
  6760.                         Src$ = OneUp(Src$)
  6761.                         IF Src$ = "" THEN GOTO SYMBOLERROR
  6762.                     END IF
  6763.                     Dest$ = GetSymbolValue(DirSym$)
  6764.                     Sect$ = Lot_GetChapterValStr(chapter$, F_NOTHING)
  6765.                     IF Dest$ <> "" and Sect$ <> "" THEN _
  6766.                         AddSectionFilesToCopyList Sect$, Src$, Dest$
  6767.                 END IF    
  6768.             END IF
  6769.             chapter$ = Lot_GetNext()
  6770.         WEND
  6771.     END FORALL
  6772.     ERASE FixupDirectorySymbolList 
  6773.     EXIT SUB
  6774.  
  6775. SYMBOLERROR:
  6776.     ErrorMsg 0, "Lot_FixupSourceDirectories: invalid symbol: "+DirSym$
  6777. '    ERROR STFQUIT
  6778.  
  6779. END SUB
  6780.  
  6781. PUBLIC FUNCTION Lot_RegIni(RegFileName$) AS INTEGER
  6782. '*************************************************************************
  6783. '** Purpose: Calls SDK program regini.exe to generate registry entries 
  6784. '**     described in script file
  6785. '** NOTE:    Entries in script file have the following format:
  6786. '**    KeyName
  6787. '**    ValueName = value
  6788. '**    e.g.,
  6789. '** \registry\machine\system\currentcontrolset\services\lanmanserver\parameters
  6790. '**      DiskSpaceThreshhold = REG_DWORD 0x00000000 
  6791. '**  
  6792. '** Author: JMDonohue
  6793. '** Arguments: 
  6794. '** RegFileName$    Name of script file for registry creation
  6795. '**************************************************************************
  6796.     Lot_RegIni = Lot_CreateConsoleProcess("regini.exe", RegFileName$)
  6797.     IF Lot_RegIni <> TRUE THEN    _
  6798.        ErrorMsg 0, "Error calling Lot_CreateConsoleProcess for regini.exe"
  6799. END FUNCTION
  6800.  
  6801. '*************************************************************************
  6802. PUBLIC SUB ComboSelChanged(BoxNo&, Inst%)
  6803. '** Purpose:   Handles change in combo box selection
  6804. '** Author:    GL
  6805. '** Arguments: 
  6806. '**        BoxNo%    combo/edit set. IDC_COMBO1 = 1
  6807. '**        Inst%        combo box item
  6808. '**
  6809. '*************************************************************************
  6810.     DIM    uncPath$, fullPath$, dirPath$
  6811.     DIM    curCombo$, uncOff&, unusedPath$
  6812.     DIM    comboBox$, editBox$
  6813.  
  6814.     comboBox = "IDC_COMBO"+Right$(Str$(BoxNo&),1)
  6815.     editBox = "IDC_EDIT"+Right$(Str$(BoxNo&),1)
  6816.  
  6817.     curCombo$ = GetListItem(comboBox, Inst%)
  6818.     fullPath$ = GetListItem("IDC_EDIT",CINT(BoxNo&))
  6819.     Lot_SplitUNCPath fullPath$, uncPath$, dirPath$
  6820.     uncOff& = INSTR(1, curCombo$, "\\") 
  6821.     IF uncOff > 0 THEN
  6822.         Lot_SplitUNCPath MID$(curCombo$, uncOff&), uncPath$, unusedPath$
  6823.     ELSE
  6824.       uncPath$ = ""
  6825.     END IF
  6826.     SetListItem "IDC_EDIT", CINT(BoxNo&), uncPath$ + dirPath$
  6827.     AddListItem SYM_UPDATELIST$, editBox
  6828.     EXIT SUB
  6829. END SUB
  6830.  
  6831. '*************************************************************************
  6832. PUBLIC FUNCTION GetPathFromComboEdit(hDlg&, BoxNo%) AS STRING
  6833. '** Purpose:   Builds path from combo/edit box
  6834. '** Author:    GL
  6835. '** Arguments: 
  6836. '**        hDlg&:    dialog handle
  6837. '**        BoxNo%    combo/edit set. IDC_COMBO1 = 1
  6838. '**
  6839. '** Returns:    Fully qualified path. Empty string on failure
  6840. '*************************************************************************
  6841.     DIM drvSel%, drvPath$, uncPath$, dirPath$, comboBox$
  6842.  
  6843.     comboBox = "IDC_COMBO"+Right$(Str$(BoxNo%),1)
  6844.     drvSel% = ValidateEditBox(hDlg&, BoxNo%)
  6845.   IF drvSel% = 0 THEN
  6846.         GetPathFromComboEdit = ""
  6847.         EXIT FUNCTION
  6848.     END IF
  6849.     Lot_SplitUNCPath GetListItem("IDC_EDIT", BoxNo%), uncPath$, dirPath$
  6850.     IF uncPath$ = "" THEN
  6851.         drvPath = LEFT$(GetListItem(comboBox, drvSel%), 2)
  6852.     ELSE
  6853.         drvPath = ""
  6854.     END IF
  6855.         GetPathFromComboEdit= drvPath$ + uncPath$ + dirPath$
  6856. END FUNCTION
  6857.  
  6858. PUBLIC SUB Lot_RegisterFonts()
  6859. '*************************************************************************
  6860. '** Purpose: Traverses the copy list looking for sections whose destination
  6861. '** directory symbol is "LOTUSFONTSDIR"; for each section, registers all 
  6862. '** font filenames with Windows, using the description corresponding to the
  6863. '** font name in 'shared.ini'
  6864. '** NOTE:    Entries in 'shared.ini' file have the following format:
  6865. '**    FontFileName = Description
  6866. '**    e.g.,
  6867. '**     ngoi____.ttf=News Gothic Italic (TrueType)
  6868. '** NOTE: This function should not be used by clients -- called as part of
  6869. '**    toolkit processing  
  6870. '**  
  6871. '** Author: JMDonohue
  6872. '**************************************************************************
  6873.     DIM s$, szSym$, szSect$, i%, j%, n%, chapter$, DirSym$, gSharedIniFile$ 
  6874.     DIM FontDescList LIST AS STRING
  6875.     DIM FontFile$, FontDesc$, winkey$, FontPath$, ret%, Size%, regStatus&, Key$ 
  6876.  
  6877.     szSym$ = "SECTIONFONTS"
  6878.    gSharedIniFile$ = MakePath(GetSymbolValue(SYM_STF_CWDDIR$), gSHAREDINI$)
  6879.     IF WhatPlatform() = PLATFORM_WIN95 THEN
  6880.         winkey$ = "Windows"
  6881.     ELSE
  6882.         winkey = "Windows NT"
  6883.     END IF
  6884.     Key$ = "SOFTWARE\Microsoft\" + WinKey$ + "\CurrentVersion\Fonts"
  6885.  
  6886.     chapter$ = Lot_GetFirst("", F_INOROUT)
  6887.     WHILE (chapter$ <> "")
  6888.         DirSym$ = Lot_GetChapterValStr(chapter$, F_DESTDIRSYM)
  6889.         IF DirSym$ = SYM_LOTUSFONTSDIR$ THEN 
  6890.             szSect$ = Lot_GetChapterValStr(chapter$, F_NOTHING)
  6891.             n% = FGetSectionFileList (szSym$, szSect$, 1)
  6892.             n% = GetListLength(szSym$)
  6893.             '' For each font in section, strip off path components
  6894.             '' and create list of filenames and descriptions        
  6895.             FOR i% = 1 TO n%
  6896.                 s$ = GetListItem(szSym$, i%) 
  6897.                 IF ISELEMENT(FontDescList(s$)) = FALSE THEN _
  6898.                     FontDescList(s$) = GetIniKeyString(gSharedIniFile$, "Fonts", s$)
  6899.             NEXT
  6900.             RemoveSymbol szSym$
  6901.         END IF
  6902.         chapter$ = Lot_GetNext()
  6903.     WEND
  6904. ' Traverse list, register all font files    
  6905. ' If font name not in database, use font name for description
  6906.     FORALL sym IN FontDescList
  6907.         FontFile$ = ListTag(sym)
  6908.         FontDesc$ = FontDescList(ListTag(sym))
  6909.         IF FontDesc$ = "" THEN FontDesc$ = FontFile$
  6910.         FontPath$ = GetSymbolValue(SYM_LOTUSFONTSDIR$) + FontFile$
  6911.         ret% = AddFontResource(FontPath$)
  6912.         Size% = len(FontPath$) + 1
  6913.         regStatus& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, _
  6914.             Key$, FontDesc$, REG_SZ, FontPath$, Size%)
  6915.     END FORALL
  6916.     
  6917. END SUB
  6918.  
  6919. PUBLIC CONST LIBFLAG_FRESTRICTED = 1 
  6920. PUBLIC CONST LIBFLAG_FCONTROL = 2 
  6921. PUBLIC CONST LIBFLAG_FHIDDEN = 4 
  6922.  
  6923. PUBLIC FUNCTION Lot_RegisterTypeLib(ID$, Version$, Description$, helppath$, filename$, flags%) AS INTEGER
  6924. '*************************************************************************
  6925. '** Purpose: Creates necessary registry entries for Type Libraries
  6926. '**  
  6927. '** Arguments: 
  6928. '**        ID$                ID, "29130064-2EED-1069-BF5D-00DD011186B7", e.g. 
  6929. '**        Version$            Version
  6930. '**        Description$    Description
  6931. '**        helppath$        Pathname of directory containing help files
  6932. '**        filename$        Fully qualified name of file
  6933. '**        flags%            See below(default is 0):
  6934. '**  
  6935. '**  Flag Value            Description
  6936. '**  LIBFLAG_FCONTROL    The type library describes controls and should not be 
  6937. '**                              displayed in type browsers intended for nonvisual objects.
  6938. '**  LIBFLAG_FRESTRICTED    The type library is restricted and should not
  6939. '**                              be displayed to users.
  6940. '**  LIBFLAG_FHIDDEN        The type library should not be displayed to users, 
  6941. '**                              although its use is not restricted. To be used by
  6942. '**                              controls; hosts should create a new type library that
  6943. '**                              wraps the control with extended properties.
  6944. '**
  6945. '** Returns:    TRUE if successful, FALSE otherwise
  6946. '**  
  6947. '** Author: JMDonohue
  6948. '**************************************************************************
  6949.     DIM key$, s$, flagstr$
  6950.     DIM LReturn& 
  6951.     
  6952.     key$ = "Typelib\" + ID$ + "\" + Version$
  6953.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, key$,_
  6954.          "", REG_SZ, Description$,  LENBP(Description$)+1)
  6955.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  6956.     s$ = key$ + "\" + "0\win32"
  6957.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  6958.          "", REG_SZ, filename$,  LENBP(filename$)+1)
  6959.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  6960.     s$ = key$ + "\" + "HELPDIR"
  6961.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  6962.          "", REG_SZ, helppath$,  LENBP(helppath$)+1)
  6963.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  6964.     s$ = key$ + "\" + "FLAGS"
  6965.     flagstr$ = CStr(flags%)
  6966.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  6967.          "", REG_SZ, flagstr$,  LENBP(flagstr$)+1)
  6968.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  6969.     Lot_RegisterTypeLib = TRUE
  6970.     EXIT FUNCTION
  6971.  
  6972. FAILED:
  6973.     Lot_RegisterTypeLib = FALSE
  6974. END FUNCTION    
  6975.  
  6976. PUBLIC FUNCTION OneUp(s$) AS STRING
  6977. '*************************************************************************
  6978. '**    Purpose: Removes the last element of a filename
  6979. '**     e.g. d:\lotus\compnent ==> d:\lotus\
  6980. '**            
  6981. '** Author:    JMDonohue
  6982. '** Arguments: s$    string to strip
  6983. '** Returns: stripped string or null string if invalid
  6984. '**     
  6985. '*************************************************************************
  6986. DIM i%
  6987.     i% = Len(s$) - 1    'Assume last character is \
  6988.     DO 
  6989.         i% = i% - 1
  6990.         IF i% = 0 THEN
  6991.             ErrorMsg 0, "Toolkit:OneUp: String does not contain \: "+s$
  6992.             OneUp = ""
  6993.             EXIT FUNCTION
  6994.         END IF
  6995.     LOOP    UNTIL Mid(s$, i%, 1) = "\"
  6996.     OneUp =  Mid(s$, 1, i%)
  6997. END FUNCTION    
  6998.  
  6999.  
  7000. PUBLIC FUNCTION Lot_AreAnyNodeOptionsAvail() AS INTEGER
  7001. '*************************************************************************
  7002. '**Purpose:Determine whether any node options are available
  7003. '**for the products selected.
  7004. '**
  7005. '**Returns:TRUE if any options are available
  7006. '**        FALSE if none
  7007. '**
  7008. '**Autor:GLutz
  7009. '*************************************************************************
  7010. DIM AllProdNum%,AllOptNum%,prodNum%,chpt$
  7011.  
  7012.     Lot_AreAnyNodeOptionsAvail = FALSE
  7013.  
  7014.     'Loop through the products and find the avail node options
  7015.     AllProdNum% = 0
  7016.     AllProdNum% = Reg_GetNumberOfProducts()
  7017.     IF AllProdNum% <> 0 THEN
  7018.         'Loop through the products
  7019.         FOR prodNum%=1 TO AllProdNum%
  7020.             AllOptNum% = 0
  7021.             AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  7022.             chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%)_
  7023.                 + gTOP$)
  7024.             IF (INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1) AND _
  7025.                 AllOptNum% <> 0 THEN
  7026.                 Lot_AreAnyNodeOptionsAvail = TRUE
  7027.             END IF
  7028.         NEXT
  7029.     END IF
  7030. END FUNCTION
  7031.  
  7032. '***********************************************************************
  7033. PUBLIC FUNCTION RemovePriorVersion(ProdRegKeyName$,ProdVer$) AS INTEGER
  7034. '**
  7035. '**Removes previous installations of 32 bit product versions.
  7036. '**
  7037. '**Parameters:
  7038. '**                        ProdRegKeyName$:Product's registry name (WordPro)
  7039. '**                        ProdVer$:Version to be remove (96.0)
  7040. '**
  7041. '**
  7042. '**
  7043. DIM prodCount%, i%, status&, RegKey$, PlatformStr$
  7044. DIM cmdLine$, dwStatus&, cbBuf&, exeName$, newCmdLine$
  7045. STATIC cmdBuf(10) AS STRING, cmdCount%
  7046.  
  7047.   IF ProdRegKeyName$ = "begin" AND _
  7048.      ProdVer$ = "execution" THEN
  7049.     FOR i% = 0 TO cmdCount%
  7050.       '***This call launches uninstall
  7051.       '***dwStatus should be STILL_ACTIVE(259)
  7052.       dwStatus& = Lot_ExecUninstall(cmdBuf(i%))
  7053.           WHILE dwStatus& = STILL_ACTIVE
  7054.         dwStatus& = Lot_ExecUninstall("")
  7055.       WEND
  7056.     NEXT
  7057.   ELSEIF ProdRegKeyName$ = "reset" AND _
  7058.          ProdVer$ = "buffer" THEN
  7059.     cmdCount% = 0
  7060.   ELSE
  7061.     exeName$ = "lunin10.exe"
  7062.     PlatformStr$ = gREGWINNAME
  7063.  
  7064.     RegKey$=PlatformStr$+"\Uninstall\"+ProdRegKeyName$+" V"+ProdVer$
  7065.  
  7066.     '** returns ERROR_SUCCESS (0) 
  7067.     status& = Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE,RegKey$,_
  7068.               "UninstallString",dwStatus&,cmdLine$,cbBuf&)
  7069.  
  7070.     IF status& = ERROR_SUCCESS THEN
  7071.       cmdLine$ = NullTrim(cmdLine$)
  7072. '***for dev purposes don't use automated uninstall
  7073.         cmdBuf(cmdCount%) = MID$(cmdLine$,INSTR(1,cmdLine$,_
  7074.                         exeName$,1)) + " /A upgrade.rsp /S"
  7075.         'cmdLine$ = MID$(cmdLine$,INSTR(1,cmdLine$,exeName$,1))
  7076.     cmdCount% = cmdCount% + 1
  7077.       END IF
  7078.   END IF
  7079. END FUNCTION
  7080.  
  7081.